#[macro_use]
extern crate log;
pub use cli::Cli;
pub use cli::complete_word::{
CandidateAnswer, answer as complete_answer, candidates as complete_candidates,
};
mod cli;
#[cfg(test)]
mod command_effects;
pub mod env;
mod schema;
mod usage_spec;
#[cfg(test)]
mod test;
pub fn run(args: &[String]) -> usage::miette::Result<()> {
if args.get(1).is_some_and(|arg| arg == "__complete_word__") {
let argv: Vec<_> = args.iter().skip(1).map(std::ffi::OsString::from).collect();
if let Some(answer) = Cli::completion_request(&argv) {
print!("{answer}");
return Ok(());
}
}
if let Some(script) = args.get(1) {
if script.to_lowercase() == "-v" {
println!("{}", cli::version());
return Ok(());
} else if script == "--usage-spec"
|| usage_rs::is_spec_request(Cli::command(), &[std::ffi::OsStr::new(script)])
{
return usage_spec::generate();
} else if script == "--completions" && args.len() > 2 {
return usage_spec::complete(args.get(2).unwrap());
}
}
let result = Cli::run(args);
if let Err(err) = &result
&& let Some(_err) = err.downcast_ref::<usage::error::UsageErr>()
{
eprintln!("{err:?}");
std::process::exit(181);
};
result
}