use clap::{Parser, Subcommand};
#[derive(Parser, Debug)]
#[command(name = "dead-poets")]
#[command(about = "Find unused (dead) gettext keys in your project", long_about = None)]
pub struct Cli {
#[command(subcommand)]
pub command: Commands,
}
#[derive(Subcommand, Debug)]
pub enum Commands {
Scan {
#[arg(default_value = ".")]
path: String,
#[arg(short, long, default_value = "dead-poets.toml")]
config: String,
#[arg(short, long, default_value = "text")]
format: String,
#[arg(short, long, action = clap::ArgAction::Count)]
verbose: u8,
#[arg(long)]
audit: bool,
#[arg(long, value_name = "N")]
max_dead: Option<usize>,
#[arg(long, value_name = "R")]
max_dead_ratio: Option<f64>,
},
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn parses_scan_args() {
let cli = Cli::try_parse_from(["dead-poets", "scan", "./proj", "--format", "json", "-vv"])
.unwrap();
let Commands::Scan {
path,
config,
format,
verbose,
audit,
max_dead,
max_dead_ratio,
} = cli.command;
assert_eq!(path, "./proj");
assert_eq!(config, "dead-poets.toml");
assert_eq!(format, "json");
assert_eq!(verbose, 2);
assert!(!audit, "audit defaults to false");
assert_eq!(max_dead, None, "max_dead defaults to None");
assert_eq!(max_dead_ratio, None, "max_dead_ratio defaults to None");
}
#[test]
fn parses_audit_flag() {
let cli = Cli::try_parse_from(["dead-poets", "scan", "--audit"]).unwrap();
let Commands::Scan { audit, .. } = cli.command;
assert!(audit);
}
#[test]
fn parses_budget_flags() {
let cli = Cli::try_parse_from(["dead-poets", "scan", "--max-dead", "2900"]).unwrap();
let Commands::Scan { max_dead, .. } = cli.command;
assert_eq!(max_dead, Some(2900));
let cli = Cli::try_parse_from(["dead-poets", "scan", "--max-dead-ratio", "0.15"]).unwrap();
let Commands::Scan { max_dead_ratio, .. } = cli.command;
assert_eq!(max_dead_ratio, Some(0.15));
}
#[test]
fn defaults_match_documented() {
let cli = Cli::try_parse_from(["dead-poets", "scan"]).unwrap();
let Commands::Scan {
path,
config,
format,
verbose,
audit,
max_dead,
max_dead_ratio,
} = cli.command;
assert_eq!(path, ".");
assert_eq!(config, "dead-poets.toml");
assert_eq!(format, "text");
assert_eq!(verbose, 0);
assert!(!audit);
assert_eq!(max_dead, None);
assert_eq!(max_dead_ratio, None);
}
}