///|
fn usage() -> String {
(
#|NeighborRota - explainable community scheduling
#|
#|Usage:
#| neighbor-rota help
#| neighbor-rota version
#| neighbor-rota scenarios
#| neighbor-rota demo [community|campus] [summary|json|markdown|csv]
#| neighbor-rota reschedule [summary|markdown]
#|
#|Examples:
#| moon run cmd/neighbor-rota -- demo community summary
#| moon run cmd/neighbor-rota -- demo campus json
#| moon run cmd/neighbor-rota -- reschedule markdown
#|
)
}
///|
fn scenarios() -> String {
(
#|community-care Community care visits with skills and continuity
#|campus-volunteers Campus event volunteers across service zones
#|sudden-absence Replan community care after a worker absence
#|
)
}
///|
fn render_schedule(schedule : @rota.Schedule, format : String) -> String {
match format {
"summary" => @rota.schedule_summary(schedule)
"json" => @rota.schedule_to_json(schedule)
"markdown" | "md" => @rota.schedule_to_markdown(schedule)
"csv" => @rota.assignments_to_csv(schedule.assignments)
_ => "unknown format: \{format}\n\n\{usage()}"
}
}
///|
fn run_demo(arguments : Array[String]) -> String {
let scenario_name = if arguments.length() >= 2 {
arguments[1]
} else {
"community"
}
let format = if arguments.length() >= 3 {
arguments[2].to_lower()
} else {
"summary"
}
match @rota.parse_demo_scenario(scenario_name) {
None => "unknown scenario: \{scenario_name}\n\n\{scenarios()}"
Some(@rota.SuddenAbsence) =>
if format == "markdown" || format == "md" {
@rota.reschedule_to_markdown(@rota.run_absence_demo())
} else {
@rota.reschedule_summary(@rota.run_absence_demo())
}
Some(scenario) => render_schedule(@rota.run_demo(scenario), format)
}
}
///|
fn main {
let raw = @env.args()
let arguments : Array[String] = []
for index = 1; index < raw.length(); index = index + 1 {
arguments.push(raw[index])
}
let command = if arguments.length() == 0 {
"help"
} else {
arguments[0].to_lower()
}
let output = match command {
"help" | "-h" | "--help" => usage()
"version" | "-v" | "--version" => "NeighborRota 0.1.0\n"
"scenarios" | "list-scenarios" => scenarios()
"demo" => run_demo(arguments)
"reschedule" => {
let format = if arguments.length() >= 2 {
arguments[1]
} else {
"summary"
}
if format == "markdown" || format == "md" {
@rota.reschedule_to_markdown(@rota.run_absence_demo())
} else {
@rota.reschedule_summary(@rota.run_absence_demo())
}
}
_ => "unknown command: \{command}\n\n\{usage()}"
}
println(output)
}