use std::path::PathBuf;
use clap::{Args, Parser, Subcommand, ValueEnum};
use serde::{Deserialize, Serialize};
use crate::diagnostic::Severity;
#[derive(Debug, Parser)]
#[command(
author,
name = "poexam",
about = "Blazingly fast PO linter.",
after_help = "For help with a specific command, see: `poexam help <command>`."
)]
#[command(version)]
pub struct Cli {
#[command(subcommand)]
pub command: Command,
}
#[derive(Debug, Subcommand)]
pub enum Command {
Check(Box<CheckArgs>),
Rules(RulesArgs),
Stats(StatsArgs),
}
#[derive(Debug, Args)]
#[allow(clippy::struct_excessive_bools)]
pub struct CheckArgs {
#[clap(help = "List of files or directories [default: .]")]
pub files: Vec<PathBuf>,
#[arg(long)]
pub show_settings: bool,
#[arg(short, long)]
pub config: Option<PathBuf>,
#[arg(long)]
pub no_config: bool,
#[arg(long)]
pub fuzzy: bool,
#[arg(long)]
pub noqa: bool,
#[arg(long)]
pub obsolete: bool,
#[arg(short, long)]
pub select: Option<String>,
#[arg(short, long)]
pub ignore: Option<String>,
#[arg(long)]
pub path_msgfmt: Option<PathBuf>,
#[arg(long)]
pub path_dicts: Option<PathBuf>,
#[arg(long)]
pub path_words: Option<PathBuf>,
#[arg(long)]
pub lang_id: Option<String>,
#[arg(long)]
pub langs: Option<String>,
#[arg(short = 'e', long, value_enum)]
pub severity: Vec<Severity>,
#[arg(long)]
pub punc_ignore_ellipsis: bool,
#[arg(short, long)]
pub no_errors: bool,
#[arg(long, value_enum, default_value_t)]
pub sort: CheckSort,
#[arg(short, long)]
pub rule_stats: bool,
#[arg(short, long)]
pub file_stats: bool,
#[arg(short, long, value_enum, default_value_t)]
pub output: CheckOutputFormat,
#[arg(short, long)]
pub quiet: bool,
}
#[derive(Clone, Debug, Default, PartialEq, Eq, ValueEnum, Serialize, Deserialize)]
pub enum CheckSort {
#[default]
Line,
Message,
Rule,
}
#[derive(Debug, Args)]
pub struct RulesArgs;
#[derive(Debug, Args)]
pub struct StatsArgs {
pub files: Vec<PathBuf>,
#[arg(short, long, value_enum, default_value_t)]
pub output: StatsOutputFormat,
#[arg(short, long, value_enum, default_value_t)]
pub sort: StatsSort,
#[arg(short, long)]
pub words: bool,
}
#[derive(Clone, Debug, Default, PartialEq, Eq, ValueEnum, Serialize, Deserialize)]
pub enum CheckOutputFormat {
#[default]
Human,
Json,
Misspelled,
}
impl std::fmt::Display for CheckOutputFormat {
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
match self {
Self::Human => write!(f, "human"),
Self::Json => write!(f, "json"),
Self::Misspelled => write!(f, "misspelled"),
}
}
}
#[derive(Clone, Debug, Default, PartialEq, Eq, ValueEnum, Serialize, Deserialize)]
pub enum StatsOutputFormat {
#[default]
Human,
Json,
}
impl std::fmt::Display for StatsOutputFormat {
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
match self {
Self::Human => write!(f, "human"),
Self::Json => write!(f, "json"),
}
}
}
#[derive(Clone, Debug, Default, PartialEq, Eq, ValueEnum, Serialize, Deserialize)]
pub enum StatsSort {
#[default]
Path,
Status,
}