pub mod api;
pub mod commands;
pub mod db;
pub mod libs;
pub fn run() -> std::process::ExitCode {
libs::output::quiet_on_a_closed_pipe();
libs::update::Updater::sweep_backup();
let args: Vec<String> = std::env::args().collect();
let daemon = args.get(1).is_some_and(|arg| arg == "--daemon-run");
let toast_action = args.get(1).is_some_and(|arg| arg == "toast-action");
let cli = (!daemon).then(|| commands::Cli::from_args(&args));
let style = libs::output::init(cli.as_ref().is_some_and(|cli| cli.json()), cli.as_ref().is_some_and(|cli| cli.plain()));
if libs::messages::macros::is_debug_mode() {
tracing_subscriber::fmt()
.with_env_filter(tracing_subscriber::EnvFilter::try_from_default_env().unwrap_or_else(|_| "kasl=debug".into()))
.with_writer(std::io::stderr)
.with_ansi(style.colour_stderr)
.init();
}
let outcome = tokio::runtime::Runtime::new().map_err(anyhow::Error::from).and_then(|runtime| {
runtime.block_on(async {
let Some(cli) = cli else {
return commands::watch::run_as_daemon().await;
};
if !toast_action && !style.json && std::io::IsTerminal::is_terminal(&std::io::stdout()) {
libs::update::Updater::show_update_notification().await;
}
cli.dispatch().await
})
});
match outcome {
Ok(()) => std::process::ExitCode::SUCCESS,
Err(error) => {
libs::output::report_error(&error);
std::process::ExitCode::FAILURE
}
}
}