use std::path::PathBuf;
use clap::error::ErrorKind;
use clap::{Parser, ValueEnum};
use crate::graph::RiskTier;
#[derive(Debug, Clone, Parser)]
#[command(name = "blast-radius")]
#[command(
version,
about = "Estimate the transitive blast radius of frontend code changes"
)]
pub struct Cli {
#[command(subcommand)]
pub command: Command,
#[arg(long, global = true, default_value = ".")]
pub repo_root: PathBuf,
#[arg(long, global = true, value_enum, default_value_t = OutputFormat::Tree)]
pub format: OutputFormat,
#[arg(long, global = true)]
pub output: Option<PathBuf>,
#[arg(long, short = 'v', global = true, default_value_t = false)]
pub verbose: bool,
#[arg(long, global = true, default_value_t = false)]
pub explain_unresolved: bool,
#[arg(long, global = true)]
pub fail_threshold: Option<usize>,
#[arg(long, global = true, value_enum)]
pub fail_on_risk: Option<RiskTier>,
}
#[derive(Debug, Clone, Parser)]
pub enum Command {
Export { file: PathBuf, export_name: String },
File { file: PathBuf },
Files {
#[arg(required = true, num_args = 1..)]
files: Vec<PathBuf>,
},
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, ValueEnum)]
pub enum OutputFormat {
Tree,
Json,
Mermaid,
Dot,
}
impl Cli {
pub fn parse_args() -> Self {
match Self::try_parse() {
Ok(cli) => cli,
Err(error) => {
let code = match error.kind() {
ErrorKind::DisplayHelp | ErrorKind::DisplayVersion => 0,
_ => 64,
};
let _ = error.print();
std::process::exit(code);
}
}
}
}