use std::env;
use midenc_driver::{
self as driver, ClapDiagnostic,
diagnostics::{IntoDiagnostic, Report, WrapErr},
};
pub fn main() -> Result<(), Report> {
if cfg!(not(debug_assertions)) && env::var_os("MIDENC_TRACE").is_none() {
human_panic::setup_panic!();
}
let mut builder = midenc_log::Builder::from_env("MIDENC_TRACE");
builder.format_indent(Some(2));
if let Ok(precision) = env::var("MIDENC_TRACE_TIMING") {
match precision.as_str() {
"s" => builder.format_timestamp_secs(),
"ms" => builder.format_timestamp_millis(),
"us" => builder.format_timestamp_micros(),
"ns" => builder.format_timestamp_nanos(),
other => {
return Err(Report::msg(format!(
"invalid MIDENC_TRACE_TIMING precision, expected one of [s, ms, us, ns], got \
'{other}'"
)));
}
};
} else {
builder.format_timestamp(None);
}
let logger = builder.build();
let filter = logger.filter();
let logger = Box::new(midenc_log::SuppressKnownDependencyErrors::new(logger));
let cwd = env::current_dir()
.into_diagnostic()
.wrap_err("could not read current working directory")?;
match driver::run(cwd, env::args_os(), logger, filter) {
Err(report) => match report.downcast::<ClapDiagnostic>() {
Ok(err) => {
err.exit()
}
Err(report) => Err(report),
},
result => result,
}
}