use clap::{Parser, Subcommand};
pub mod commands;
pub mod config;
pub mod output;
#[derive(Parser)]
#[command(
name = "qualifier",
version,
about = "Deterministic quality attestations for software artifacts"
)]
pub struct Cli {
#[command(subcommand)]
pub command: Commands,
}
#[derive(Subcommand)]
pub enum Commands {
Attest(Box<commands::attest::Args>),
Show(commands::show::Args),
Score(commands::score::Args),
Ls(commands::ls::Args),
Check(commands::check::Args),
Compact(commands::compact::Args),
Graph(commands::graph_cmd::Args),
Haiku,
Init,
#[command(alias = "blame")]
Praise(commands::praise::Args),
}
pub fn run() {
let used_blame_alias = std::env::args().nth(1).is_some_and(|arg| arg == "blame");
let cli = Cli::parse();
if used_blame_alias {
eprintln!(
"hint: the command is \"praise\" \u{2014} qualifier tracks who helped, not who to blame"
);
}
let result: crate::Result<()> = match cli.command {
Commands::Attest(args) => commands::attest::run(*args),
Commands::Show(args) => commands::show::run(args),
Commands::Score(args) => commands::score::run(args),
Commands::Ls(args) => commands::ls::run(args),
Commands::Check(args) => commands::check::run(args),
Commands::Compact(args) => commands::compact::run(args),
Commands::Graph(args) => commands::graph_cmd::run(args),
Commands::Haiku => {
commands::haiku::run();
Ok(())
}
Commands::Init => commands::init::run(),
Commands::Praise(args) => commands::praise::run(args),
};
if let Err(e) = result {
match &e {
crate::Error::CheckFailed(msg) => {
eprintln!("\n{msg}");
std::process::exit(1);
}
_ => {
eprintln!("qualifier: {e}");
std::process::exit(1);
}
}
}
}