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