mod batch;
mod parsers;
#[cfg(test)]
mod tests;
#[cfg(test)]
mod tests_batch;
mod types;
mod values;
use parsers::{
parse_census, parse_export, parse_info, parse_metrics, parse_optimize, parse_render_job,
parse_retarget, parse_solve, parse_sweep, parse_validate,
};
pub use types::{
Batch, CensusArgs, Command, ExportArgs, ExportFormat, InfoArgs, JobCommandKind, MaterialArg,
MetricsArgs, Mode, OptimizeArgs, RenderJobArgs, ReportFormat, ReportStyle, RetargetArgs,
SolveArgs, SweepArgs, Topic, ValidateArgs, lighting_name, preset_name,
};
#[cfg(test)]
pub use types::{CensusBuiltins, CensusOutput};
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),
"solve" => parse_solve(rest),
"metrics" => parse_metrics(rest),
"validate" => parse_validate(rest),
"optimize" => parse_optimize(rest),
"retarget" => parse_retarget(rest),
"sweep" => parse_sweep(rest),
"export" => parse_export(rest),
"census" => parse_census(rest),
"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, census, render or tilt-video; see --help)"
)),
}
}