use std::path::PathBuf;
use clap::{ArgMatches, CommandFactory, FromArgMatches, Parser, Subcommand};
use crate::{
completions::Shell,
display::{LanguageSortKey, NumberStyle, OutputFormat, SizeStyle, SortDirection},
};
#[derive(Parser)]
#[command(version, about, long_about = None)]
pub struct Cli {
#[command(subcommand)]
pub command: Option<Commands>,
#[command(flatten)]
pub analyze: AnalyzeArgs,
}
#[derive(Subcommand)]
pub enum Commands {
Completions {
#[arg(value_enum)]
shell: Shell,
},
Langs,
}
#[derive(Parser)]
#[allow(clippy::struct_excessive_bools)]
pub struct AnalyzeArgs {
#[arg(short = 'c', long = "config")]
pub config: Option<PathBuf>,
#[arg(value_name = "PATH", default_value = ".")]
pub path: PathBuf,
#[arg(short, long)]
pub verbose: bool,
#[arg(short = 'i', long)]
pub no_gitignore: bool,
#[arg(short = 'H', long = "hidden")]
pub hidden: bool,
#[arg(short = 'S', long)]
pub symlinks: bool,
#[arg(short, long, value_enum, default_value = "plain")]
pub number_style: NumberStyle,
#[arg(short = 'u', long = "size-units", value_enum, default_value = "binary")]
pub size_style: SizeStyle,
#[arg(short = 'p', long = "precision", default_value_t = 1, value_parser = clap::value_parser!(u8).range(0..=6))]
pub percent_precision: u8,
#[arg(short = 's', long = "sort-by", value_enum, default_value = "lines")]
pub language_sort: LanguageSortKey,
#[arg(short = 'd', long = "sort-dir", value_enum, default_value = "desc")]
pub sort_direction: SortDirection,
#[arg(short, long, default_value = "human")]
pub output: OutputFormat,
#[arg(short, long)]
pub exclude: Vec<String>,
#[arg(short = 'L', long = "lang", conflicts_with = "exclude_lang")]
pub include_lang: Vec<String>,
#[arg(long = "exclude-lang", conflicts_with = "include_lang")]
pub exclude_lang: Vec<String>,
#[arg(long = "fail-on-error")]
pub fail_on_error: bool,
}
impl Cli {
pub fn parse_with_matches() -> (Self, ArgMatches) {
let command = Self::command();
let matches = command.get_matches();
let cli = Self::from_arg_matches(&matches).expect("clap already validated arguments");
(cli, matches)
}
}