usage_cli/
lib.rs

1#[macro_use]
2extern crate log;
3extern crate miette;
4extern crate xx;
5
6use std::path::PathBuf;
7
8use miette::Result;
9
10use cli::Cli;
11
12mod cli;
13pub mod env;
14mod hash;
15mod shebang;
16mod usage_spec;
17
18#[cfg(test)]
19mod test;
20
21pub fn run(args: &[String]) -> Result<()> {
22    // trace!(
23    //     "args: {:?}",
24    //     args.iter().map(|s| s[..100].to_string()).collect_vec()
25    // );
26    // if let Some("__USAGE__") = args.get(2).map(|s| s.as_str()) {
27    //     return split_script(&args[1]);
28    // } else if let Some(script) = args.get(1) {
29    if let Some(script) = args.get(1) {
30        if script.to_lowercase() == "-v" {
31            println!("{} {}", env!("CARGO_PKG_NAME"), env!("CARGO_PKG_VERSION"));
32            return Ok(());
33        } else if script == "--usage-spec" {
34            return usage_spec::generate();
35        } else if script == "--completions" && args.len() > 2 {
36            return usage_spec::complete(args.get(2).unwrap());
37        } else if script.starts_with("./") || script.starts_with('/') {
38            let script: PathBuf = script.into();
39            if script.starts_with("./") && script.exists() {
40                return shebang::execute(&script, args);
41            }
42        }
43    }
44    let result = Cli::run(args);
45    if let Err(err) = &result {
46        if let Some(_err) = err.downcast_ref::<usage::error::UsageErr>() {
47            eprintln!("{err:?}");
48            std::process::exit(181);
49        }
50    };
51
52    result
53}