//! Command-line definition. //! //! The tool is a Spanish dictionary for Spanish speakers, so every command, //! flag and help text the user sees is in Spanish. Rust names are in English //! and mapped explicitly (`name = "..."`, `long = "..."`). use std::path::PathBuf; use clap::{Parser, Subcommand, ValueEnum}; #[derive(Parser)] #[command( name = "drae", version, about = "Diccionario de la lengua española en la terminal", long_about = "drae — consulta el Diccionario de la lengua española (RAE) sin salir de la terminal.\n\ Sin orden, define la palabra que se le pase: `drae casa`.\n\ Lo consultado queda en caché, así que la segunda vez responde sin red.", args_conflicts_with_subcommands = true )] pub struct Cli { /// La palabra a definir (equivale a `drae definir `) #[arg(value_name = "PALABRA")] pub word: Option, #[command(subcommand)] pub cmd: Option, /// Archivo de configuración (por defecto ~/.config/drae/config.toml) #[arg(long, global = true, value_name = "ARCHIVO")] pub config: Option, /// Imprime JSON en lugar del texto formateado #[arg(long, global = true)] pub json: bool, /// Cuándo colorear la salida #[arg(long, global = true, value_enum, default_value_t = Color::Auto)] pub color: Color, /// Ancho de salida en columnas (por defecto, el de la terminal) #[arg(long = "ancho", global = true, value_name = "N")] pub width: Option, /// Despliega el significado de las abreviaturas (f. = nombre femenino) #[arg(long = "abreviaturas", short = 'a', global = true)] pub expand_abbr: bool, /// Ignora la caché y vuelve a descargar #[arg(long = "actualizar", short = 'A', global = true)] pub refresh: bool, /// No leer ni escribir la caché #[arg(long = "sin-cache", global = true)] pub no_cache: bool, /// De dónde leer: auto (rae-api con respaldo), dle o rae-api #[arg(long = "fuente", global = true, value_enum)] pub source: Option, } #[derive(Clone, Copy, PartialEq, Eq, ValueEnum)] pub enum Color { Auto, Always, Never, } #[derive(Clone, Copy, PartialEq, Eq, ValueEnum)] pub enum Source { Auto, Dle, #[value(name = "rae-api")] RaeApi, } #[derive(Subcommand)] pub enum Cmd { /// Define una palabra. Úsalo cuando la palabra coincida con el nombre de /// una orden: `drae definir sin` #[command(name = "definir", alias = "def")] Define { #[arg(value_name = "PALABRA")] word: String, }, /// Sinónimos y antónimos de una palabra #[command(name = "sinonimos", alias = "sin")] Synonyms { #[arg(value_name = "PALABRA")] word: String, }, /// Conjugación completa de un verbo #[command(name = "conjugar", alias = "conj")] Conjugate { #[arg(value_name = "VERBO")] verb: String, /// Solo este modo: indicativo, subjuntivo, imperativo… #[arg(long = "modo", value_name = "MODO")] mood: Option, }, /// La palabra del día que publica la RAE #[command(name = "dia")] WordOfTheDay, /// Una palabra al azar del diccionario #[command(name = "azar")] Random, /// Busca un texto dentro de las definiciones ya guardadas en caché #[command(name = "buscar")] Search { #[arg(value_name = "TEXTO")] text: String, #[arg(long, default_value_t = 20)] max: usize, }, /// Gestiona la caché local Cache { #[command(subcommand)] action: CacheCmd, }, } #[derive(Subcommand)] pub enum CacheCmd { /// Cuántas entradas hay y dónde viven Info, /// Las últimas palabras consultadas #[command(name = "listar")] List { #[arg(long, default_value_t = 30)] max: usize, }, /// Borra todo lo guardado #[command(name = "limpiar")] Clear, }