use std::path::PathBuf;
use clap::{Args as ClapArgs, Parser, Subcommand, ValueEnum};
use crate::count::Tokenizer;
use crate::report::SortBy;
use crate::units::{Cognitive, Cyclomatic, Depth, Lines, Params, Tokens};
#[derive(Clone, Copy, Debug, ValueEnum)]
pub enum Format {
Table,
Json,
Md,
Github,
Sarif,
Html,
}
#[derive(Parser, Debug)]
#[command(version, args_conflicts_with_subcommands = true)]
pub struct Args {
#[command(subcommand)]
pub command: Option<Command>,
#[command(flatten)]
pub check: CheckArgs,
}
#[derive(Subcommand, Debug)]
pub enum Command {
Init(WalkArgs),
Ratchet(RatchetArgs),
Mcp,
}
#[derive(ClapArgs, Debug, Clone)]
pub struct WalkArgs {
#[arg(default_value = ".")]
pub path: PathBuf,
#[arg(short, long, value_enum, default_value_t = Tokenizer::O200k)]
pub tokenizer: Tokenizer,
#[arg(long, value_name = "FILE")]
pub config: Option<PathBuf>,
#[arg(short, long)]
pub include: Vec<String>,
#[arg(short, long)]
pub exclude: Vec<String>,
#[arg(long)]
pub hidden: bool,
#[arg(long)]
pub no_default_excludes: bool,
}
#[derive(ClapArgs, Debug)]
pub struct RatchetArgs {
#[command(flatten)]
pub walk: WalkArgs,
#[arg(long)]
pub dry_run: bool,
}
#[derive(ClapArgs, Debug)]
pub struct CheckArgs {
#[command(flatten)]
pub walk: WalkArgs,
#[arg(short, long, value_enum, default_value_t = Format::Table)]
pub format: Format,
#[arg(short, long, value_enum, default_value_t = SortBy::Tokens)]
pub sort: SortBy,
#[arg(short = 'n', long, default_value_t = 20)]
pub top: usize,
#[arg(long)]
pub max_file_tokens: Option<Tokens>,
#[arg(long)]
pub max_file_lines: Option<Lines>,
#[arg(long)]
pub max_fn_lines: Option<Lines>,
#[arg(long)]
pub max_fn_tokens: Option<Tokens>,
#[arg(long)]
pub max_fn_depth: Option<Depth>,
#[arg(long)]
pub max_fn_params: Option<Params>,
#[arg(long)]
pub max_fn_cyclomatic: Option<Cyclomatic>,
#[arg(long)]
pub max_fn_cognitive: Option<Cognitive>,
#[arg(long)]
pub dirs: bool,
#[arg(long, value_name = "FILE")]
pub baseline: Option<PathBuf>,
#[arg(long, value_name = "REV")]
pub changed_since: Option<String>,
#[arg(long)]
pub no_allow: bool,
#[arg(long)]
pub no_functions: bool,
#[arg(long)]
pub fail_on_warn: bool,
#[arg(long, value_name = "PATH")]
pub json_out: Option<PathBuf>,
}