use clap::{Args, Parser, Subcommand, ValueEnum};
use std::path::PathBuf;
#[derive(Parser, Debug)]
#[command(
name = "license-trace",
author,
version,
about = "Recursive license tracer, obligations lower-bound evaluator, and OSS compliance analyzer",
long_about = "Traces recursive dependencies and analyzes license compatibility (e.g. MIT readiness), obligations, and path origins."
)]
pub struct Cli {
#[command(subcommand)]
pub command: Commands,
}
#[derive(Subcommand, Debug)]
pub enum Commands {
#[command(alias = "a", alias = "check")]
Audit(AuditArgs),
#[command(alias = "t")]
Trace(TraceArgs),
#[command(alias = "w")]
Why(WhyArgs),
#[command(alias = "e", alias = "notice")]
Export(ExportArgs),
}
#[derive(ValueEnum, Clone, Copy, Debug, PartialEq, Eq)]
pub enum OutputFormat {
Audit,
Table,
Tree,
Json,
Markdown,
CycloneDx,
Sarif,
}
#[derive(Args, Debug)]
pub struct AuditArgs {
#[arg(short, long, default_value = ".")]
pub path: PathBuf,
#[arg(short, long, default_value = "MIT")]
pub outbound: String,
#[arg(short = 'P', long)]
pub prod_only: bool,
#[arg(short, long, value_enum, default_value = "audit")]
pub format: OutputFormat,
#[arg(short = 'i', long)]
pub fail_on_incompatible: bool,
#[arg(short = 'u', long)]
pub fail_on_unknown: bool,
}
#[derive(Args, Debug)]
pub struct TraceArgs {
#[arg(default_value = ".")]
pub target: String,
#[arg(short = 'd', short_alias = 'm', long, default_value = "10")]
pub max_depth: usize,
#[arg(short, long, default_value = "MIT")]
pub outbound: String,
#[arg(short = 'P', long)]
pub prod_only: bool,
#[arg(short, long, value_enum, default_value = "audit")]
pub format: OutputFormat,
#[arg(short = 'i', long)]
pub fail_on_incompatible: bool,
#[arg(short = 'u', long)]
pub fail_on_unknown: bool,
}
#[derive(Args, Debug)]
pub struct WhyArgs {
pub package: String,
#[arg(short, long, default_value = ".")]
pub path: PathBuf,
}
#[derive(Args, Debug)]
pub struct ExportArgs {
#[arg(default_value = ".")]
pub path: PathBuf,
#[arg(short, long)]
pub output: Option<PathBuf>,
#[arg(short = 'P', long)]
pub prod_only: bool,
}