use clap::{Parser, ValueEnum};
use std::path::PathBuf;
#[derive(Parser)]
#[command(name = "typst-count")]
#[command(version, about = "Count words and characters in Typst documents")]
#[command(long_about = "Count words and characters in Typst documents.\n\n\
Counts are based on the compiled document, meaning only rendered \
text is counted. Code, markup, headers, and footers are excluded.")]
pub struct Cli {
#[arg(required = true, value_name = "FILE")]
pub input: Vec<PathBuf>,
#[arg(short = 'f', long, value_enum, default_value_t = OutputFormat::Human)]
pub format: OutputFormat,
#[arg(short = 'm', long = "mode", value_enum, default_value_t = CountMode::Both)]
pub mode: CountMode,
#[arg(short = 'o', long = "output", value_name = "FILE")]
pub output: Option<PathBuf>,
#[arg(short = 'd', long = "display", value_enum, default_value_t = DisplayMode::Auto)]
pub display: DisplayMode,
#[arg(short = 'e', long = "exclude-imports")]
pub exclude_imports: bool,
#[arg(long, value_name = "N")]
pub max_words: Option<usize>,
#[arg(long, value_name = "N")]
pub min_words: Option<usize>,
#[arg(long, value_name = "N")]
pub max_characters: Option<usize>,
#[arg(long, value_name = "N")]
pub min_characters: Option<usize>,
}
#[derive(Clone, Copy, ValueEnum, Debug)]
pub enum OutputFormat {
Human,
Json,
Csv,
}
#[derive(Clone, Copy, ValueEnum, PartialEq, Eq, Debug)]
pub enum CountMode {
Both,
Words,
Characters,
}
#[derive(Clone, Copy, ValueEnum, PartialEq, Eq, Debug)]
pub enum DisplayMode {
Auto,
Total,
Quiet,
Detailed,
}