Skip to main content

whichtime_sys/dictionaries/
es.rs

1//! Spanish (Español) locale dictionaries
2
3use super::{CasualDateType, CasualTimeType, RelativeModifier, TimeUnit, Weekday};
4use phf::phf_map;
5
6/// Weekday dictionary
7pub static WEEKDAY_MAP: phf::Map<&'static str, Weekday> = phf_map! {
8    "domingo" => Weekday::Sunday,
9    "dom" => Weekday::Sunday,
10    "dom." => Weekday::Sunday,
11    "lunes" => Weekday::Monday,
12    "lun" => Weekday::Monday,
13    "lun." => Weekday::Monday,
14    "martes" => Weekday::Tuesday,
15    "mar" => Weekday::Tuesday,
16    "mar." => Weekday::Tuesday,
17    "miércoles" => Weekday::Wednesday,
18    "miercoles" => Weekday::Wednesday,
19    "mié" => Weekday::Wednesday,
20    "mie" => Weekday::Wednesday,
21    "mié." => Weekday::Wednesday,
22    "mie." => Weekday::Wednesday,
23    "jueves" => Weekday::Thursday,
24    "jue" => Weekday::Thursday,
25    "jue." => Weekday::Thursday,
26    "viernes" => Weekday::Friday,
27    "vie" => Weekday::Friday,
28    "vie." => Weekday::Friday,
29    "sábado" => Weekday::Saturday,
30    "sabado" => Weekday::Saturday,
31    "sáb" => Weekday::Saturday,
32    "sab" => Weekday::Saturday,
33    "sáb." => Weekday::Saturday,
34    "sab." => Weekday::Saturday,
35};
36
37/// Month dictionary
38pub static MONTH_MAP: phf::Map<&'static str, u32> = phf_map! {
39    "enero" => 1,
40    "ene" => 1,
41    "ene." => 1,
42    "febrero" => 2,
43    "feb" => 2,
44    "feb." => 2,
45    "marzo" => 3,
46    "mar" => 3,
47    "mar." => 3,
48    "abril" => 4,
49    "abr" => 4,
50    "abr." => 4,
51    "mayo" => 5,
52    "may" => 5,
53    "may." => 5,
54    "junio" => 6,
55    "jun" => 6,
56    "jun." => 6,
57    "julio" => 7,
58    "jul" => 7,
59    "jul." => 7,
60    "agosto" => 8,
61    "ago" => 8,
62    "ago." => 8,
63    "septiembre" => 9,
64    "setiembre" => 9,
65    "sep" => 9,
66    "sep." => 9,
67    "set" => 9,
68    "set." => 9,
69    "octubre" => 10,
70    "oct" => 10,
71    "oct." => 10,
72    "noviembre" => 11,
73    "nov" => 11,
74    "nov." => 11,
75    "diciembre" => 12,
76    "dic" => 12,
77    "dic." => 12,
78};
79
80/// Integer words dictionary
81pub static INTEGER_WORD_MAP: phf::Map<&'static str, f64> = phf_map! {
82    "uno" => 1.0,
83    "una" => 1.0,
84    "un" => 1.0,
85    "dos" => 2.0,
86    "tres" => 3.0,
87    "cuatro" => 4.0,
88    "cinco" => 5.0,
89    "seis" => 6.0,
90    "siete" => 7.0,
91    "ocho" => 8.0,
92    "nueve" => 9.0,
93    "diez" => 10.0,
94    "once" => 11.0,
95    "doce" => 12.0,
96    "trece" => 13.0,
97};
98
99/// Time unit dictionary
100pub static TIME_UNIT_MAP: phf::Map<&'static str, TimeUnit> = phf_map! {
101    "sec" => TimeUnit::Second,
102    "segundo" => TimeUnit::Second,
103    "segundos" => TimeUnit::Second,
104    "min" => TimeUnit::Minute,
105    "mins" => TimeUnit::Minute,
106    "minuto" => TimeUnit::Minute,
107    "minutos" => TimeUnit::Minute,
108    "h" => TimeUnit::Hour,
109    "hr" => TimeUnit::Hour,
110    "hrs" => TimeUnit::Hour,
111    "hora" => TimeUnit::Hour,
112    "horas" => TimeUnit::Hour,
113    "día" => TimeUnit::Day,
114    "dia" => TimeUnit::Day,
115    "días" => TimeUnit::Day,
116    "dias" => TimeUnit::Day,
117    "semana" => TimeUnit::Week,
118    "semanas" => TimeUnit::Week,
119    "mes" => TimeUnit::Month,
120    "meses" => TimeUnit::Month,
121    "trimestre" => TimeUnit::Quarter,
122    "trimestres" => TimeUnit::Quarter,
123    "año" => TimeUnit::Year,
124    "ano" => TimeUnit::Year,
125    "años" => TimeUnit::Year,
126    "anos" => TimeUnit::Year,
127};
128
129/// Casual date keywords
130pub static CASUAL_DATE_MAP: phf::Map<&'static str, CasualDateType> = phf_map! {
131    "ahora" => CasualDateType::Now,
132    "hoy" => CasualDateType::Today,
133    "esta noche" => CasualDateType::Tonight,
134    "esta mañana" => CasualDateType::ThisMorning,
135    "esta manana" => CasualDateType::ThisMorning,
136    "esta tarde" => CasualDateType::ThisAfternoon,
137    "mañana" => CasualDateType::Tomorrow,
138    "manana" => CasualDateType::Tomorrow,
139    "ayer" => CasualDateType::Yesterday,
140    "pasado mañana" => CasualDateType::Overmorrow,
141    "pasado manana" => CasualDateType::Overmorrow,
142    "anteayer" => CasualDateType::DayBeforeYesterday,
143    "antes de ayer" => CasualDateType::DayBeforeYesterday,
144};
145
146/// Casual time keywords
147pub static CASUAL_TIME_MAP: phf::Map<&'static str, CasualTimeType> = phf_map! {
148    "mediodía" => CasualTimeType::Noon,
149    "mediodia" => CasualTimeType::Noon,
150    "medianoche" => CasualTimeType::Midnight,
151    "mañana" => CasualTimeType::Morning,
152    "manana" => CasualTimeType::Morning,
153    "tarde" => CasualTimeType::Afternoon,
154    "noche" => CasualTimeType::Night,
155};
156
157/// Relative modifiers
158pub static RELATIVE_MODIFIER_MAP: phf::Map<&'static str, RelativeModifier> = phf_map! {
159    "este" => RelativeModifier::This,
160    "esta" => RelativeModifier::This,
161    "estos" => RelativeModifier::This,
162    "estas" => RelativeModifier::This,
163    "próximo" => RelativeModifier::Next,
164    "proximo" => RelativeModifier::Next,
165    "próxima" => RelativeModifier::Next,
166    "proxima" => RelativeModifier::Next,
167    "siguiente" => RelativeModifier::Next,
168    "pasado" => RelativeModifier::Last,
169    "pasada" => RelativeModifier::Last,
170    "último" => RelativeModifier::Last,
171    "ultimo" => RelativeModifier::Last,
172    "última" => RelativeModifier::Last,
173    "ultima" => RelativeModifier::Last,
174    "anterior" => RelativeModifier::Last,
175};
176
177// ============================================================================
178// Lookup functions
179// ============================================================================
180
181#[inline]
182pub fn get_weekday(s: &str) -> Option<Weekday> {
183    WEEKDAY_MAP.get(s).copied()
184}
185
186#[inline]
187pub fn get_month(s: &str) -> Option<u32> {
188    MONTH_MAP.get(s).copied()
189}
190
191#[inline]
192pub fn get_integer_word(s: &str) -> Option<f64> {
193    INTEGER_WORD_MAP.get(s).copied()
194}
195
196#[inline]
197pub fn get_time_unit(s: &str) -> Option<TimeUnit> {
198    TIME_UNIT_MAP.get(s).copied()
199}
200
201#[inline]
202pub fn get_casual_date(s: &str) -> Option<CasualDateType> {
203    CASUAL_DATE_MAP.get(s).copied()
204}
205
206#[inline]
207pub fn get_casual_time(s: &str) -> Option<CasualTimeType> {
208    CASUAL_TIME_MAP.get(s).copied()
209}
210
211#[inline]
212pub fn get_relative_modifier(s: &str) -> Option<RelativeModifier> {
213    RELATIVE_MODIFIER_MAP.get(s).copied()
214}
215
216/// Parse a number pattern
217pub fn parse_number_pattern(text: &str) -> f64 {
218    let lower = text.to_lowercase();
219
220    if let Some(val) = get_integer_word(&lower) {
221        return val;
222    }
223
224    match lower.as_str() {
225        s if s.contains("algunos") || s.contains("unos") => return 3.0,
226        s if s.contains("media") => return 0.5,
227        _ => {}
228    }
229
230    text.parse::<f64>().unwrap_or(0.0)
231}