mod parsers;
#[cfg(test)]
mod tests;
mod types;
mod values;
use parsers::{
parse_export, parse_info, parse_metrics, parse_optimize, parse_render_job, parse_retarget,
parse_solve, parse_sweep, parse_validate,
};
pub use types::{
Command, ExportArgs, ExportFormat, InfoArgs, JobCommandKind, MaterialArg, MetricsArgs, Mode,
OptimizeArgs, RenderJobArgs, ReportFormat, RetargetArgs, SolveArgs, SweepArgs, Topic,
ValidateArgs, lighting_name, preset_name,
};
pub fn parse(argv: &[String]) -> Result<Command, String> {
let Some(first) = argv.first().map(String::as_str) else {
return Ok(Command::Help(Topic::Root));
};
if argv.iter().any(|a| a == "-h" || a == "--help") {
return Ok(Command::Help(Topic::of(first)));
}
let rest = &argv[1..];
match first {
"-V" | "--version" | "version" => Ok(Command::Version),
"help" => Ok(Command::Help(
rest.first().map_or(Topic::Root, |w| Topic::of(w)),
)),
"info" => parse_info(rest).map(Command::Info),
"solve" => parse_solve(rest).map(Command::Solve),
"metrics" => parse_metrics(rest).map(Command::Metrics),
"validate" => parse_validate(rest).map(Command::Validate),
"optimize" => parse_optimize(rest).map(Command::Optimize),
"retarget" => parse_retarget(rest).map(Command::Retarget),
"sweep" => parse_sweep(rest).map(Command::Sweep),
"export" => parse_export(rest).map(Command::Export),
"render" => parse_render_job(JobCommandKind::Render, rest).map(Command::Render),
"tilt-video" => parse_render_job(JobCommandKind::TiltVideo, rest).map(Command::TiltVideo),
other => Err(format!(
"unknown command {other:?} (expected info, solve, metrics, validate, optimize, \
retarget, sweep, export, render or tilt-video; see --help)"
)),
}
}