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 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}