Skip to main content

whichtime_sys/dictionaries/
it.rs

1//! Italian (Italiano) 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    "domenica" => Weekday::Sunday,
9    "dom" => Weekday::Sunday,
10    "dom." => Weekday::Sunday,
11    "lunedì" => Weekday::Monday,
12    "lunedi" => Weekday::Monday,
13    "lun" => Weekday::Monday,
14    "lun." => Weekday::Monday,
15    "martedì" => Weekday::Tuesday,
16    "martedi" => Weekday::Tuesday,
17    "mar" => Weekday::Tuesday,
18    "mar." => Weekday::Tuesday,
19    "mercoledì" => Weekday::Wednesday,
20    "mercoledi" => Weekday::Wednesday,
21    "merc" => Weekday::Wednesday,
22    "merc." => Weekday::Wednesday,
23    "mer" => Weekday::Wednesday,
24    "mer." => Weekday::Wednesday,
25    "giovedì" => Weekday::Thursday,
26    "giovedi" => Weekday::Thursday,
27    "giov" => Weekday::Thursday,
28    "giov." => Weekday::Thursday,
29    "gio" => Weekday::Thursday,
30    "gio." => Weekday::Thursday,
31    "venerdì" => Weekday::Friday,
32    "venerdi" => Weekday::Friday,
33    "ven" => Weekday::Friday,
34    "ven." => Weekday::Friday,
35    "sabato" => Weekday::Saturday,
36    "sab" => Weekday::Saturday,
37    "sab." => Weekday::Saturday,
38};
39
40/// Month dictionary
41pub static MONTH_MAP: phf::Map<&'static str, u32> = phf_map! {
42    "gennaio" => 1,
43    "gen" => 1,
44    "gen." => 1,
45    "febbraio" => 2,
46    "febraio" => 2,
47    "feb" => 2,
48    "feb." => 2,
49    "febb" => 2,
50    "febb." => 2,
51    "marzo" => 3,
52    "mar" => 3,
53    "mar." => 3,
54    "aprile" => 4,
55    "apr" => 4,
56    "apr." => 4,
57    "maggio" => 5,
58    "mag" => 5,
59    "mag." => 5,
60    "giugno" => 6,
61    "giu" => 6,
62    "giu." => 6,
63    "luglio" => 7,
64    "lug" => 7,
65    "lug." => 7,
66    "lugl" => 7,
67    "lugl." => 7,
68    "agosto" => 8,
69    "ago" => 8,
70    "ago." => 8,
71    "settembre" => 9,
72    "set" => 9,
73    "set." => 9,
74    "sett" => 9,
75    "sett." => 9,
76    "ottobre" => 10,
77    "ott" => 10,
78    "ott." => 10,
79    "novembre" => 11,
80    "nov" => 11,
81    "nov." => 11,
82    "dicembre" => 12,
83    "dic" => 12,
84    "dic." => 12,
85    "dice" => 12,
86};
87
88/// Integer words dictionary
89pub static INTEGER_WORD_MAP: phf::Map<&'static str, f64> = phf_map! {
90    "uno" => 1.0,
91    "una" => 1.0,
92    "un" => 1.0,
93    "due" => 2.0,
94    "tre" => 3.0,
95    "quattro" => 4.0,
96    "cinque" => 5.0,
97    "sei" => 6.0,
98    "sette" => 7.0,
99    "otto" => 8.0,
100    "nove" => 9.0,
101    "dieci" => 10.0,
102    "undici" => 11.0,
103    "dodici" => 12.0,
104};
105
106/// Ordinal words dictionary
107pub static ORDINAL_WORD_MAP: phf::Map<&'static str, u32> = phf_map! {
108    "primo" => 1,
109    "secondo" => 2,
110    "terzo" => 3,
111    "quarto" => 4,
112    "quinto" => 5,
113    "sesto" => 6,
114    "settimo" => 7,
115    "ottavo" => 8,
116    "nono" => 9,
117    "decimo" => 10,
118    "undicesimo" => 11,
119    "dodicesimo" => 12,
120    "tredicesimo" => 13,
121    "quattordicesimo" => 14,
122    "quindicesimo" => 15,
123    "sedicesimo" => 16,
124    "diciassettesimo" => 17,
125    "diciottesimo" => 18,
126    "diciannovesimo" => 19,
127    "ventesimo" => 20,
128    "ventunesimo" => 21,
129    "ventiduesimo" => 22,
130    "ventitreesimo" => 23,
131    "ventiquattresimo" => 24,
132    "venticinquesimo" => 25,
133    "ventiseiesimo" => 26,
134    "ventisettesimo" => 27,
135    "ventottesimo" => 28,
136    "ventinovesimo" => 29,
137    "trentesimo" => 30,
138    "trentunesimo" => 31,
139};
140
141/// Time unit dictionary
142pub static TIME_UNIT_MAP: phf::Map<&'static str, TimeUnit> = phf_map! {
143    "sec" => TimeUnit::Second,
144    "secondo" => TimeUnit::Second,
145    "secondi" => TimeUnit::Second,
146    "min" => TimeUnit::Minute,
147    "mins" => TimeUnit::Minute,
148    "minuto" => TimeUnit::Minute,
149    "minuti" => TimeUnit::Minute,
150    "h" => TimeUnit::Hour,
151    "hr" => TimeUnit::Hour,
152    "o" => TimeUnit::Hour,
153    "ora" => TimeUnit::Hour,
154    "ore" => TimeUnit::Hour,
155    "giorno" => TimeUnit::Day,
156    "giorni" => TimeUnit::Day,
157    "settimana" => TimeUnit::Week,
158    "settimane" => TimeUnit::Week,
159    "mese" => TimeUnit::Month,
160    "mesi" => TimeUnit::Month,
161    "trimestre" => TimeUnit::Quarter,
162    "trimestri" => TimeUnit::Quarter,
163    "anno" => TimeUnit::Year,
164    "anni" => TimeUnit::Year,
165};
166
167/// Casual date keywords
168pub static CASUAL_DATE_MAP: phf::Map<&'static str, CasualDateType> = phf_map! {
169    "adesso" => CasualDateType::Now,
170    "ora" => CasualDateType::Now,
171    "oggi" => CasualDateType::Today,
172    "stasera" => CasualDateType::Tonight,
173    "stanotte" => CasualDateType::Tonight,
174    "stamattina" => CasualDateType::ThisMorning,
175    "domani" => CasualDateType::Tomorrow,
176    "ieri" => CasualDateType::Yesterday,
177    "dopodomani" => CasualDateType::Overmorrow,
178    "l'altro ieri" => CasualDateType::DayBeforeYesterday,
179    "altroieri" => CasualDateType::DayBeforeYesterday,
180};
181
182/// Casual time keywords
183pub static CASUAL_TIME_MAP: phf::Map<&'static str, CasualTimeType> = phf_map! {
184    "mezzogiorno" => CasualTimeType::Noon,
185    "mezzanotte" => CasualTimeType::Midnight,
186    "mattina" => CasualTimeType::Morning,
187    "mattino" => CasualTimeType::Morning,
188    "pomeriggio" => CasualTimeType::Afternoon,
189    "sera" => CasualTimeType::Evening,
190    "notte" => CasualTimeType::Night,
191};
192
193/// Relative modifiers
194pub static RELATIVE_MODIFIER_MAP: phf::Map<&'static str, RelativeModifier> = phf_map! {
195    "questo" => RelativeModifier::This,
196    "questa" => RelativeModifier::This,
197    "questi" => RelativeModifier::This,
198    "queste" => RelativeModifier::This,
199    "prossimo" => RelativeModifier::Next,
200    "prossima" => RelativeModifier::Next,
201    "prossimi" => RelativeModifier::Next,
202    "prossime" => RelativeModifier::Next,
203    "seguente" => RelativeModifier::Next,
204    "scorso" => RelativeModifier::Last,
205    "scorsa" => RelativeModifier::Last,
206    "scorsi" => RelativeModifier::Last,
207    "scorse" => RelativeModifier::Last,
208    "passato" => RelativeModifier::Last,
209    "passata" => RelativeModifier::Last,
210    "ultimo" => RelativeModifier::Last,
211    "ultima" => RelativeModifier::Last,
212    "precedente" => RelativeModifier::Last,
213};
214
215// ============================================================================
216// Lookup functions
217// ============================================================================
218
219#[inline]
220pub fn get_weekday(s: &str) -> Option<Weekday> {
221    WEEKDAY_MAP.get(s).copied()
222}
223
224#[inline]
225pub fn get_month(s: &str) -> Option<u32> {
226    MONTH_MAP.get(s).copied()
227}
228
229#[inline]
230pub fn get_integer_word(s: &str) -> Option<f64> {
231    INTEGER_WORD_MAP.get(s).copied()
232}
233
234#[inline]
235pub fn get_ordinal_word(s: &str) -> Option<u32> {
236    ORDINAL_WORD_MAP.get(s).copied()
237}
238
239#[inline]
240pub fn get_time_unit(s: &str) -> Option<TimeUnit> {
241    TIME_UNIT_MAP.get(s).copied()
242}
243
244#[inline]
245pub fn get_casual_date(s: &str) -> Option<CasualDateType> {
246    CASUAL_DATE_MAP.get(s).copied()
247}
248
249#[inline]
250pub fn get_casual_time(s: &str) -> Option<CasualTimeType> {
251    CASUAL_TIME_MAP.get(s).copied()
252}
253
254#[inline]
255pub fn get_relative_modifier(s: &str) -> Option<RelativeModifier> {
256    RELATIVE_MODIFIER_MAP.get(s).copied()
257}
258
259/// Parse a number pattern
260pub fn parse_number_pattern(text: &str) -> f64 {
261    let lower = text.to_lowercase();
262
263    if let Some(val) = get_integer_word(&lower) {
264        return val;
265    }
266
267    match lower.as_str() {
268        s if s.contains("alcuni") => return 3.0,
269        s if s.contains("metà") || s.contains("meta") => return 0.5,
270        s if s.contains("paio") => return 2.0,
271        s if s.contains("molti") => return 7.0,
272        _ => {}
273    }
274
275    text.parse::<f64>().unwrap_or(0.0)
276}
277
278/// Parse an ordinal number pattern
279pub fn parse_ordinal_pattern(text: &str) -> Option<u32> {
280    let lower = text.to_lowercase();
281
282    if let Some(val) = get_ordinal_word(&lower) {
283        return Some(val);
284    }
285
286    let cleaned = lower
287        .trim_end_matches("°")
288        .trim_end_matches("imo")
289        .trim_end_matches("esimo");
290
291    cleaned.parse::<u32>().ok()
292}