1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
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,
}
|