#![cfg_attr(coverage_nightly, feature(coverage_attribute))]
#![cfg_attr(coverage_nightly, coverage(off))]
use std::path::PathBuf;
use std::process::ExitCode;
use argh::FromArgs;
use cargo_detect_package::{OutsidePackageAction, RunInput, RunOutcome, run};
#[derive(FromArgs)]
struct Args {
#[argh(option)]
path: PathBuf,
#[argh(option)]
via_env: Option<String>,
#[argh(option)]
outside_package: Option<OutsidePackageAction>,
#[argh(positional, greedy)]
subcommand: Vec<String>,
}
#[cfg_attr(test, mutants::skip)]
fn main() -> ExitCode {
let mut env_args: Vec<String> = std::env::args().collect();
if env_args.get(1).is_some_and(|arg| arg == "detect-package") {
env_args.remove(1);
}
let str_args: Vec<&str> = env_args.iter().map(String::as_str).collect();
let program_name = str_args
.first()
.expect("std::env::args() always provides at least the program name");
let args: Args = match Args::from_args(&[program_name], str_args.get(1..).unwrap_or(&[])) {
Ok(args) => args,
Err(early_exit) => {
println!("{}", early_exit.output);
return if early_exit.output.contains("help") {
ExitCode::SUCCESS
} else {
ExitCode::FAILURE
};
}
};
let input = RunInput {
path: args.path,
via_env: args.via_env,
outside_package: args
.outside_package
.unwrap_or(OutsidePackageAction::Workspace),
subcommand: args.subcommand,
};
match run(&input) {
Ok(outcome) => match outcome {
RunOutcome::PackageDetected {
subcommand_succeeded,
..
}
| RunOutcome::WorkspaceScope {
subcommand_succeeded,
} => {
if subcommand_succeeded {
ExitCode::SUCCESS
} else {
ExitCode::FAILURE
}
}
RunOutcome::Ignored => ExitCode::SUCCESS,
},
Err(e) => {
eprintln!("Error: {e}");
ExitCode::FAILURE
}
}
}