aboutsummaryrefslogtreecommitdiffstats
path: root/src/cli.rs
diff options
context:
space:
mode:
authorElvis Claros Castro <elvis@claros.ar>2026-09-26 19:00:45 -0300
committerElvis Claros Castro <elvis@claros.ar>2026-09-26 19:00:45 -0300
commita946ba81f7a6089713337644053b00b825824a98 (patch)
treedf7c98401b3a879a0283e940afa3fecc9453d9d4 /src/cli.rs
downloaddrae-cli-main.tar.gz
drae-cli-main.zip
drae: the RAE Spanish dictionary in the terminalHEADmain
Diffstat (limited to 'src/cli.rs')
-rw-r--r--src/cli.rs141
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,
+}