diff options
Diffstat (limited to 'src/cli.rs')
| -rw-r--r-- | src/cli.rs | 141 |
1 files changed, 141 insertions, 0 deletions
diff --git a/src/cli.rs b/src/cli.rs new file mode 100644 index 0000000..9f23838 --- /dev/null +++ b/src/cli.rs @@ -0,0 +1,141 @@ +//! 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 <palabra>`) + #[arg(value_name = "PALABRA")] + pub word: Option<String>, + + #[command(subcommand)] + pub cmd: Option<Cmd>, + + /// Archivo de configuración (por defecto ~/.config/drae/config.toml) + #[arg(long, global = true, value_name = "ARCHIVO")] + pub config: Option<PathBuf>, + + /// 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<usize>, + + /// 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<Source>, +} + +#[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<String>, + }, + + /// 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, +} |