use clap::{crate_name, CommandFactory, Parser, ValueEnum};
use clap_complete::{generate, Shell};
use fluent_i18n::t;
use std::io;
use std::process::exit;
static CONTRIBUTORS: &str = include_str!("../Contributors");
static CHANGELOG: &str = include_str!("../ChangeLog");
#[derive(Parser, Debug)]
#[command(author, version, about, long_about = None)]
#[command(propagate_version = true)]
#[allow(clippy::struct_excessive_bools)]
pub struct Cli {
#[arg(long, default_value = "")]
pub filename: String,
#[arg(long, default_value_t = 6)]
pub minlen: usize,
#[arg(long, default_value_t = false)]
pub noop: bool,
#[arg(long)]
pub only_list_typos: Option<TypoType>,
#[arg(long, default_value_t = false)]
pub details: bool,
#[arg(long, default_value = "fix(typo): corrects '{typo}' into '{correction}'")]
pub message: String,
#[arg(long)]
pub typo: Option<Vec<String>>,
#[arg(long)]
pub exclude_file: Option<Vec<String>>,
#[arg(long)]
pub exclude_typo: Option<Vec<String>>,
#[arg(long)]
pub exclude_correction: Option<Vec<String>>,
#[arg(long, default_value_t = false)]
pub debug: bool,
#[arg(long, default_value_t = false)]
pub contributors: bool,
#[arg(long, default_value_t = false)]
pub changelog: bool,
#[arg(long, default_value = None)]
pub completion: Option<Shell>,
}
#[derive(ValueEnum, Debug, Clone)]
pub enum TypoType {
All,
Corrected,
NotCorrected,
}
impl Cli {
pub fn analyze() -> Self {
let cli = Cli::parse();
if cli.contributors {
print!("{CONTRIBUTORS}");
exit(0);
}
if cli.changelog {
print!("{CHANGELOG}");
exit(0);
}
if let Some(shell) = cli.completion {
let mut cmd = Cli::command();
generate(shell, &mut cmd, crate_name!(), &mut io::stdout());
exit(0);
}
if cli.filename.is_empty() {
let mut cmd = Cli::command();
match cmd.print_help() {
Ok(()) => eprintln!("\n{}", t!("cli-error-command")),
Err(e) => eprintln!("{}", t!("cli-error-help", {"e" => e.to_string()})),
}
exit(1);
}
cli
}
}