1use super::{CasualDateType, CasualTimeType, RelativeModifier, TimeUnit, Weekday};
4use phf::phf_map;
5
6pub 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
40pub 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
88pub 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
106pub 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
141pub 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
167pub 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
182pub 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
193pub 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#[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
259pub 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
278pub 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}