use std::path::PathBuf;
use clap::{ArgAction, Parser, Subcommand, ValueEnum};
#[derive(Debug, Parser)]
#[command(name = "patchsense", version, about, arg_required_else_help = true)]
pub struct Cli {
#[command(subcommand)]
pub command: Command,
}
#[derive(Debug, Subcommand)]
pub enum Command {
Scan(ScanArgs),
Cache(CacheArgs),
Init(InitArgs),
Comment(CommentArgs),
Mcp,
}
#[derive(Debug, Parser)]
pub struct CacheArgs {
#[arg(long, global = true)]
pub cache_dir: Option<PathBuf>,
#[command(subcommand)]
pub command: CacheCommand,
}
#[derive(Debug, Parser)]
pub struct CommentArgs {
#[arg(long, value_name = "FILE")]
pub report: PathBuf,
#[arg(long, value_name = "PROVIDER", default_value = "auto")]
pub provider: String,
#[arg(long, value_name = "N")]
pub top: Option<usize>,
#[arg(long)]
pub dry_run: bool,
}
#[derive(Debug, Parser)]
pub struct InitArgs {
#[arg(long)]
pub force: bool,
#[arg(
long,
num_args = 0..=1,
default_missing_value = "all",
value_name = "AGENT"
)]
pub agent: Option<String>,
#[arg(long)]
pub print_mcp_config: bool,
}
#[derive(Debug, Subcommand)]
pub enum CacheCommand {
Clear,
Info,
}
#[derive(Debug, Parser)]
pub struct ScanArgs {
pub path: Option<PathBuf>,
#[arg(long, action = ArgAction::SetTrue, overrides_with = "no_keep_going")]
pub keep_going: bool,
#[arg(long, action = ArgAction::SetTrue, overrides_with = "keep_going")]
pub no_keep_going: bool,
#[arg(long, value_delimiter = ',', value_name = "LIST")]
pub ecosystem: Vec<String>,
#[arg(long)]
pub no_dev: bool,
#[arg(long)]
pub offline: bool,
#[arg(long)]
pub strict_cache: bool,
#[arg(long)]
pub no_cache: bool,
#[arg(long)]
pub cache_dir: Option<PathBuf>,
#[arg(long, value_name = "FILE")]
pub config: Option<PathBuf>,
#[arg(long, value_name = "WHEN")]
pub fail_on: Option<String>,
#[arg(long, action = ArgAction::Append)]
pub exclude: Vec<String>,
#[arg(long, value_name = "N")]
pub min_score: Option<u32>,
#[arg(long)]
pub no_color: bool,
#[arg(
short = 'f',
long = "format",
value_enum,
action = ArgAction::Append,
value_name = "FORMAT"
)]
pub format: Vec<ReportFormat>,
#[arg(short = 'o', long = "output", action = ArgAction::Append, value_name = "FILE")]
pub output: Vec<PathBuf>,
#[arg(long)]
pub explain: bool,
#[arg(long, value_name = "AGENT")]
pub agent: Option<String>,
#[arg(long, value_name = "N")]
pub explain_top: Option<u32>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, ValueEnum)]
pub enum ReportFormat {
Table,
Json,
Sarif,
Markdown,
Gitlab,
}