#![deny(unsafe_code)]
use asimov_snapshot_cli::commands;
use clientele::{
StandardOptions,
SysexitsError::{self, *},
crates::clap::{Parser, Subcommand},
};
use color_print::ceprintln;
#[derive(Debug, Parser)]
#[command(name = "asimov-snapshot", long_about)]
#[command(arg_required_else_help = true)]
struct Options {
#[clap(flatten)]
flags: StandardOptions,
#[clap(subcommand)]
command: Command,
}
#[derive(Debug, Subcommand)]
enum Command {
#[command(external_subcommand)]
Snapshot(Vec<String>),
List,
Log {
url: String,
},
Compact {
urls: Vec<String>,
},
}
pub fn main() -> SysexitsError {
clientele::dotenv().ok();
let Ok(args) = clientele::args_os() else {
return EX_USAGE;
};
let options = Options::parse_from(&args);
asimov_module::init_tracing_subscriber(&options.flags).expect("failed to initialize logging");
if options.flags.version {
println!("asimov-snapshot {}", env!("CARGO_PKG_VERSION"));
return EX_OK;
}
if options.flags.license {
print!("{}", include_str!("../UNLICENSE"));
return EX_OK;
}
if let Err(err) = std::fs::create_dir_all(asimov_env::paths::asimov_root().join("snapshots"))
.map_err(|e| {
ceprintln!("<s,r>error:</> failed to create snapshot directory: {e}");
EX_IOERR
})
{
return err;
}
let result = match options.command {
Command::Snapshot(ref urls) => commands::snapshot(urls, &options.flags),
Command::List => commands::list(&options.flags),
Command::Log { url } => commands::log(&url, &options.flags),
Command::Compact { urls } => commands::compact(&urls, &options.flags),
};
match result {
Ok(()) => EX_OK,
Err(err) => err,
}
}