garbage-code-hunter 0.2.2

A humorous Rust code quality detector that roasts your garbage code
Documentation
use clap::{Parser, Subcommand};
use std::path::PathBuf;

#[derive(Parser)]
#[command(name = "garbage-code-hunter")]
#[command(about = "A humorous Rust code quality detector that roasts your garbage code \u{1f525}")]
#[command(version)]
pub struct Cli {
    #[command(subcommand)]
    pub command: Option<Commands>,
}

#[derive(Subcommand)]
pub enum Commands {
    Analyze(AnalyzeArgs),
    #[command(alias = "cr")]
    CommitRoaster(CommitRoasterArgs),
    #[command(alias = "ds")]
    DepsShamer(DepsShamerArgs),
    #[command(alias = "pr")]
    PrTitleHunter(PrTitleHunterArgs),
    Scan(ScanArgs),
    Badge(BadgeArgs),
    Trend(TrendArgs),
    #[command(alias = "lw")]
    LastWords(LastWordsArgs),
    #[command(alias = "debt")]
    DebtInvoice(DebtInvoiceArgs),
    Personality(PersonalityArgs),
    Decay(DecayArgs),
    Autopsy(AutopsyArgs),
    Radar(RadarArgs),
    CiBot(CiBotArgs),
    Persona(PersonaArgs),
    #[command(alias = "dz")]
    DangerZone(DangerZoneArgs),
    TeamRoast(TeamRoastArgs),
}

#[derive(Parser)]
pub struct AnalyzeArgs {
    #[arg(default_value = ".")]
    pub path: PathBuf,
    #[arg(long)]
    pub harsh: bool,
    #[arg(short, long)]
    pub verbose: bool,
    #[arg(short = 'i', long, default_value = "5")]
    pub issues: usize,
    #[arg(short = 's', long)]
    pub summary: bool,
    #[arg(short, long)]
    pub brief: bool,
    #[arg(short, long)]
    pub markdown: bool,
    #[arg(short, long, default_value = "en-US")]
    pub lang: String,
    #[arg(short, long)]
    pub exclude: Vec<String>,
    #[arg(long)]
    pub educational: bool,
    #[arg(long)]
    pub project_config: Option<PathBuf>,
    #[arg(long)]
    pub hall_of_shame: bool,
    #[arg(long)]
    pub suggestions: bool,
    #[arg(short = 'f', long, default_value = "text")]
    pub format: String,
    #[arg(long)]
    pub llm: bool,
    #[arg(long, default_value = "ollama")]
    pub llm_provider: String,
    #[arg(long)]
    pub llm_endpoint: Option<String>,
    #[arg(long)]
    pub llm_model: Option<String>,
    #[arg(long)]
    pub llm_api_key: Option<String>,
    #[arg(long, default_value = "30")]
    pub llm_timeout: u64,
    #[arg(long)]
    pub config: Option<PathBuf>,
}

impl Default for AnalyzeArgs {
    fn default() -> Self {
        Self {
            path: PathBuf::from("."),
            harsh: false,
            verbose: false,
            issues: 5,
            summary: false,
            brief: false,
            markdown: false,
            lang: "en-US".to_string(),
            exclude: Vec::new(),
            educational: false,
            hall_of_shame: false,
            suggestions: false,
            format: "text".to_string(),
            llm: false,
            llm_provider: "ollama".to_string(),
            llm_endpoint: None,
            llm_model: None,
            llm_api_key: None,
            llm_timeout: 30,
            config: None,
            project_config: None,
        }
    }
}

#[derive(Parser)]
pub struct CommitRoasterArgs {
    #[arg(default_value = ".")]
    pub path: PathBuf,
    #[arg(short, long, default_value = "50")]
    pub limit: usize,
    #[arg(short, long)]
    pub author: Option<String>,
    #[arg(long)]
    pub since: Option<String>,
    #[arg(long)]
    pub until: Option<String>,
    #[arg(short, long)]
    pub branch: Option<String>,
    #[arg(short = 'f', long, default_value = "terminal")]
    pub format: String,
}

#[derive(Parser)]
pub struct DepsShamerArgs {
    #[arg(default_value = ".")]
    pub path: PathBuf,
    #[arg(short = 'f', long, default_value = "terminal")]
    pub format: String,
}

#[derive(Parser)]
pub struct PrTitleHunterArgs {
    #[arg(default_value = ".")]
    pub path: PathBuf,
    #[arg(short, long, default_value = "50")]
    pub limit: usize,
    #[arg(short = 'f', long, default_value = "terminal")]
    pub format: String,
    #[arg(short, long)]
    pub repo: Option<String>,
    #[arg(long, default_value = "all")]
    pub state: String,
    #[arg(long)]
    pub token: Option<String>,
    #[arg(long)]
    pub author: Option<String>,
}

#[derive(Parser)]
pub struct ScanArgs {
    #[arg(default_value = ".")]
    pub path: PathBuf,
    #[arg(short, long, default_value = "en-US")]
    pub lang: String,
    #[arg(short = 'f', long, default_value = "terminal")]
    pub format: String,
    #[arg(long)]
    pub save: bool,
    #[arg(long)]
    pub project_config: Option<PathBuf>,
}

#[derive(Parser)]
pub struct TrendArgs {
    #[arg(short, long, default_value = "10")]
    pub last: usize,
    #[arg(short = 'f', long, default_value = "terminal")]
    pub format: String,
}

#[derive(Parser)]
pub struct BadgeArgs {
    #[arg(short, long, default_value = "badge.svg")]
    pub output: PathBuf,
    #[arg(long, default_value = "flat")]
    pub style: String,
    #[arg(long)]
    pub score: Option<f64>,
    #[arg(default_value = ".")]
    pub path: PathBuf,
}

#[derive(Parser)]
pub struct LastWordsArgs {
    #[arg(default_value = ".")]
    pub path: PathBuf,
    #[arg(long)]
    pub age: bool,
    #[arg(short = 'f', long, default_value = "terminal")]
    pub format: String,
    #[arg(short, long, default_value = "en-US")]
    pub lang: String,
}

#[derive(Parser)]
pub struct DebtInvoiceArgs {
    #[arg(default_value = ".")]
    pub path: PathBuf,
    #[arg(short = 'f', long, default_value = "terminal")]
    pub format: String,
    #[arg(short, long, default_value = "en-US")]
    pub lang: String,
}

#[derive(Parser)]
pub struct PersonalityArgs {
    #[arg(default_value = ".")]
    pub path: PathBuf,
    #[arg(short = 'f', long, default_value = "terminal")]
    pub format: String,
    #[arg(short, long, default_value = "en-US")]
    pub lang: String,
}

#[derive(Parser)]
pub struct DecayArgs {
    #[arg(default_value = ".")]
    pub path: PathBuf,
    #[arg(short = 'f', long, default_value = "terminal")]
    pub format: String,
    #[arg(short, long, default_value = "en-US")]
    pub lang: String,
}

#[derive(Parser)]
pub struct AutopsyArgs {
    #[arg(default_value = ".")]
    pub path: PathBuf,
    #[arg(short = 'f', long, default_value = "terminal")]
    pub format: String,
    #[arg(short, long, default_value = "en-US")]
    pub lang: String,
}

#[derive(Parser)]
pub struct RadarArgs {
    #[arg(default_value = ".")]
    pub path: PathBuf,
    #[arg(short = 'f', long, default_value = "terminal")]
    pub format: String,
    #[arg(short, long, default_value = "en-US")]
    pub lang: String,
    #[arg(short, long)]
    pub output: Option<PathBuf>,
}

#[derive(Parser)]
pub struct CiBotArgs {
    #[arg(default_value = ".")]
    pub path: PathBuf,
    #[arg(short = 'f', long, default_value = "terminal")]
    pub format: String,
    #[arg(short, long, default_value = "en-US")]
    pub lang: String,
}

#[derive(Parser)]
pub struct PersonaArgs {
    #[arg(default_value = ".")]
    pub path: PathBuf,
    #[arg(short, long, default_value = "linux-kernel")]
    pub persona: String,
    #[arg(short = 'f', long, default_value = "terminal")]
    pub format: String,
    #[arg(short, long, default_value = "en-US")]
    pub lang: String,
}

#[derive(Parser)]
pub struct DangerZoneArgs {
    #[arg(default_value = ".")]
    pub path: PathBuf,
    #[arg(short = 'f', long, default_value = "terminal")]
    pub format: String,
    #[arg(short, long, default_value = "en-US")]
    pub lang: String,
}

#[derive(Parser)]
pub struct TeamRoastArgs {
    #[arg(default_value = ".")]
    pub path: PathBuf,
    #[arg(short, long, default_value = "100")]
    pub limit: usize,
    #[arg(short = 'f', long, default_value = "terminal")]
    pub format: String,
    #[arg(short = 'L', long, default_value = "en-US")]
    pub lang: String,
}