use crate::repl::state::DictionaryBackend;
use crate::transducer::Algorithm;
use clap::{ArgGroup, Parser, ValueEnum};
use std::path::PathBuf;
#[derive(Parser)]
#[command(name = "liblevenshtein")]
#[command(about = "Fast fuzzy string matching with Levenshtein automata")]
#[command(version)]
#[command(group(
ArgGroup::new("operation")
.required(true)
.args(["compile", "phonetic", "query", "repl", "info", "convert",
"insert", "delete", "clear", "minimize", "settings", "config_mgmt",
"compile_regex", "match_regex", "grep"])
))]
pub struct Cli {
#[arg(short = 'c', long = "config")]
pub config_file: Option<PathBuf>,
#[arg(short = 'C', long)]
pub compile: bool,
#[arg(short = 'P', long)]
pub phonetic: bool,
#[arg(short = 'Q', long)]
pub query: bool,
#[arg(short = 'R', long)]
pub repl: bool,
#[arg(short = 'I', long)]
pub info: bool,
#[arg(long)]
pub convert: bool,
#[arg(long)]
pub insert: bool,
#[arg(short = 'D', long)]
pub delete: bool,
#[arg(long)]
pub clear: bool,
#[arg(short = 'M', long)]
pub minimize: bool,
#[arg(short = 'S', long)]
pub settings: bool,
#[arg(long)]
pub config_mgmt: bool,
#[arg(long = "compile-regex")]
pub compile_regex: bool,
#[arg(long = "match-regex")]
pub match_regex: bool,
#[arg(short = 'G', long)]
pub grep: bool,
#[arg(long)]
pub input: Option<PathBuf>,
#[arg(short = 'o', long)]
pub output: Option<PathBuf>,
#[arg(short = 'd', long)]
pub dict: Option<PathBuf>,
#[arg(short = 'r', long)]
pub rules: Option<PathBuf>,
#[arg(long)]
pub text: Option<String>,
#[arg(value_name = "TERMS")]
pub terms: Vec<String>,
#[arg(long, default_value = "true")]
pub unicode: bool,
#[arg(long)]
pub verify: bool,
#[arg(long)]
pub compiled: bool,
#[arg(long)]
pub multiline: bool,
#[arg(long)]
pub dotall: bool,
#[arg(long)]
pub pattern: Option<String>,
#[arg(long)]
pub files: Vec<PathBuf>,
#[arg(long = "with-filename")]
pub with_filename: bool,
#[arg(long = "no-filename")]
pub no_filename: bool,
#[arg(short = 'n', long = "line-number")]
pub line_number: bool,
#[arg(long = "column")]
pub column: bool,
#[arg(long = "count")]
pub count: bool,
#[arg(long = "no-color")]
pub no_color: bool,
#[arg(short = 'i', long = "ignore-case")]
pub ignore_case: bool,
#[arg(short = 'O', long = "only-matching")]
pub only_matching: bool,
#[arg(long = "no-decompress")]
pub no_decompress: bool,
#[arg(short = 'A', long = "archive-filter")]
pub archive_filter: Option<String>,
#[arg(long = "max-file-size")]
pub max_file_size: Option<u64>,
#[arg(long = "hidden")]
pub include_hidden: bool,
#[arg(long = "extract-documents")]
pub extract_documents: bool,
#[arg(long = "ocr")]
pub enable_ocr: bool,
#[arg(long = "ocr-lang", default_value = "eng")]
pub ocr_language: String,
#[arg(short = 'b', long)]
pub backend: Option<DictionaryBackend>,
#[arg(short = 'f', long)]
pub format: Option<SerializationFormat>,
#[arg(short = 'a', long, default_value = "standard")]
pub algorithm: Algorithm,
#[arg(short = 'm', long, default_value = "2")]
pub max_distance: usize,
#[arg(short = 'p', long)]
pub prefix: bool,
#[arg(short = 's', long)]
pub show_distances: bool,
#[arg(short = 'l', long)]
pub limit: Option<usize>,
#[arg(long)]
pub auto_sync: bool,
#[arg(long)]
pub from_backend: Option<DictionaryBackend>,
#[arg(long, default_value = "path-map")]
pub to_backend: DictionaryBackend,
#[arg(long)]
pub from_format: Option<SerializationFormat>,
#[arg(long, default_value = "bincode")]
pub to_format: SerializationFormat,
#[arg(long)]
pub set_dict: Option<PathBuf>,
#[arg(long)]
pub set_backend: Option<DictionaryBackend>,
#[arg(long)]
pub set_format: Option<SerializationFormat>,
#[arg(long)]
pub set_algorithm: Option<Algorithm>,
#[arg(long)]
pub set_max_distance: Option<usize>,
#[arg(long)]
pub reset: bool,
#[arg(long)]
pub switch: Option<PathBuf>,
#[arg(long)]
pub show: bool,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, ValueEnum, serde::Serialize, serde::Deserialize)]
pub enum SerializationFormat {
Text,
Bincode,
Json,
#[cfg(feature = "protobuf")]
Protobuf,
#[cfg(feature = "compression")]
#[value(name = "bincode-gz")]
BincodeGzip,
#[cfg(feature = "compression")]
#[value(name = "json-gz")]
JsonGzip,
#[cfg(all(feature = "protobuf", feature = "compression"))]
#[value(name = "protobuf-gz")]
ProtobufGzip,
#[value(name = "paths")]
PathsNative,
}
impl std::fmt::Display for SerializationFormat {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
Self::Text => write!(f, "text"),
Self::Bincode => write!(f, "bincode"),
Self::Json => write!(f, "json"),
#[cfg(feature = "protobuf")]
Self::Protobuf => write!(f, "protobuf"),
#[cfg(feature = "compression")]
Self::BincodeGzip => write!(f, "bincode-gz"),
#[cfg(feature = "compression")]
Self::JsonGzip => write!(f, "json-gz"),
#[cfg(all(feature = "protobuf", feature = "compression"))]
Self::ProtobufGzip => write!(f, "protobuf-gz"),
Self::PathsNative => write!(f, "paths"),
}
}
}