1use clap::{crate_name, CommandFactory, Parser, ValueEnum};
2use clap_complete::{generate, Shell};
3use fluent_i18n::t;
4use std::io;
5use std::process::exit;
6
7static CONTRIBUTORS: &str = include_str!("../Contributors");
9
10static CHANGELOG: &str = include_str!("../ChangeLog");
12
13#[derive(Parser, Debug)]
14#[command(author, version, about, long_about = None)]
17#[command(propagate_version = true)]
18#[allow(clippy::struct_excessive_bools)]
19pub struct Cli {
20 #[arg(long, default_value = "")]
22 pub filename: String,
23
24 #[arg(long, default_value_t = 6)]
26 pub minlen: usize,
27
28 #[arg(long, default_value_t = false)]
30 pub noop: bool,
31
32 #[arg(long)]
34 pub only_list_typos: Option<TypoType>,
35
36 #[arg(long, default_value_t = false)]
38 pub details: bool,
39
40 #[arg(long, default_value = "Corrects typo '{typo}' into '{correction}'")]
42 pub message: String,
43
44 #[arg(long)]
46 pub exclude_file: Option<Vec<String>>,
47
48 #[arg(long)]
50 pub exclude_typo: Option<Vec<String>>,
51
52 #[arg(long)]
54 pub exclude_correction: Option<Vec<String>>,
55
56 #[arg(long, default_value_t = false)]
58 pub debug: bool,
59
60 #[arg(long, default_value_t = false)]
62 pub contributors: bool,
63
64 #[arg(long, default_value_t = false)]
66 pub changelog: bool,
67
68 #[arg(long, default_value = None)]
70 pub completion: Option<Shell>,
71}
72
73#[derive(ValueEnum, Debug, Clone)]
74pub enum TypoType {
75 All,
76 Corrected,
77 NotCorrected,
78}
79
80impl Cli {
81 pub fn analyze() -> Self {
82 let cli = Cli::parse();
86
87 if cli.contributors {
88 print!("{CONTRIBUTORS}");
89 exit(0);
90 }
91
92 if cli.changelog {
93 print!("{CHANGELOG}");
94 exit(0);
95 }
96
97 if let Some(shell) = cli.completion {
98 let mut cmd = Cli::command();
99 generate(shell, &mut cmd, crate_name!(), &mut io::stdout());
100 exit(0);
101 }
102
103 if cli.filename.is_empty() {
104 let mut cmd = Cli::command();
105 match cmd.print_help() {
106 Ok(()) => eprintln!("\n{}", t!("cli-error-command")),
107 Err(e) => eprintln!("{}", t!("cli-error-help", {"e" => e.to_string()})),
108 }
109 exit(1);
110 }
111
112 cli
113 }
114}