use bpaf::{Args, ParseFailure};
use haz_cli::{EXIT_INTERNAL_OR_CONFIG_ERROR, cli, dispatch};
use miette::{IntoDiagnostic, WrapErr};
const PARSE_FAILURE_RENDER_WIDTH: usize = 100;
fn main() {
let cmd = match cli::cli().run_inner(Args::current_args()) {
Ok(cmd) => cmd,
Err(failure) => {
failure.print_message(PARSE_FAILURE_RENDER_WIDTH);
let exit_code = match failure {
ParseFailure::Stdout(..) | ParseFailure::Completion(..) => 0,
ParseFailure::Stderr(..) => EXIT_INTERNAL_OR_CONFIG_ERROR,
};
std::process::exit(exit_code);
}
};
let exit_code = match run(&cmd) {
Ok(code) => code,
Err(report) => {
eprintln!("{report:?}");
EXIT_INTERNAL_OR_CONFIG_ERROR
}
};
std::process::exit(exit_code);
}
fn run(cmd: &cli::Cmd) -> miette::Result<i32> {
let cwd = std::env::current_dir()
.into_diagnostic()
.wrap_err("cannot read current working directory")?;
dispatch(cmd, &cwd)
}