1use super::{CasualDateType, CasualTimeType, RelativeModifier, TimeUnit, Weekday};
4use phf::phf_map;
5
6pub static WEEKDAY_MAP: phf::Map<&'static str, Weekday> = phf_map! {
8 "dimanche" => Weekday::Sunday,
9 "dim" => Weekday::Sunday,
10 "dim." => Weekday::Sunday,
11 "lundi" => Weekday::Monday,
12 "lun" => Weekday::Monday,
13 "lun." => Weekday::Monday,
14 "mardi" => Weekday::Tuesday,
15 "mar" => Weekday::Tuesday,
16 "mar." => Weekday::Tuesday,
17 "mercredi" => Weekday::Wednesday,
18 "mer" => Weekday::Wednesday,
19 "mer." => Weekday::Wednesday,
20 "jeudi" => Weekday::Thursday,
21 "jeu" => Weekday::Thursday,
22 "jeu." => Weekday::Thursday,
23 "vendredi" => Weekday::Friday,
24 "ven" => Weekday::Friday,
25 "ven." => Weekday::Friday,
26 "samedi" => Weekday::Saturday,
27 "sam" => Weekday::Saturday,
28 "sam." => Weekday::Saturday,
29};
30
31pub static MONTH_MAP: phf::Map<&'static str, u32> = phf_map! {
33 "janvier" => 1,
34 "jan" => 1,
35 "jan." => 1,
36 "janv" => 1,
37 "janv." => 1,
38 "février" => 2,
39 "fevrier" => 2,
40 "fév" => 2,
41 "fev" => 2,
42 "fév." => 2,
43 "fev." => 2,
44 "mars" => 3,
45 "mar" => 3,
46 "mar." => 3,
47 "avril" => 4,
48 "avr" => 4,
49 "avr." => 4,
50 "mai" => 5,
51 "juin" => 6,
52 "jun" => 6,
53 "jun." => 6,
54 "juillet" => 7,
55 "juil" => 7,
56 "juil." => 7,
57 "jul" => 7,
58 "jul." => 7,
59 "août" => 8,
60 "aout" => 8,
61 "aoû" => 8,
62 "aou" => 8,
63 "septembre" => 9,
64 "sep" => 9,
65 "sep." => 9,
66 "sept" => 9,
67 "sept." => 9,
68 "octobre" => 10,
69 "oct" => 10,
70 "oct." => 10,
71 "novembre" => 11,
72 "nov" => 11,
73 "nov." => 11,
74 "décembre" => 12,
75 "decembre" => 12,
76 "déc" => 12,
77 "dec" => 12,
78 "déc." => 12,
79 "dec." => 12,
80};
81
82pub static INTEGER_WORD_MAP: phf::Map<&'static str, f64> = phf_map! {
84 "un" => 1.0,
85 "une" => 1.0,
86 "deux" => 2.0,
87 "trois" => 3.0,
88 "quatre" => 4.0,
89 "cinq" => 5.0,
90 "six" => 6.0,
91 "sept" => 7.0,
92 "huit" => 8.0,
93 "neuf" => 9.0,
94 "dix" => 10.0,
95 "onze" => 11.0,
96 "douze" => 12.0,
97 "treize" => 13.0,
98};
99
100pub static TIME_UNIT_MAP: phf::Map<&'static str, TimeUnit> = phf_map! {
102 "sec" => TimeUnit::Second,
103 "seconde" => TimeUnit::Second,
104 "secondes" => TimeUnit::Second,
105 "min" => TimeUnit::Minute,
106 "mins" => TimeUnit::Minute,
107 "minute" => TimeUnit::Minute,
108 "minutes" => TimeUnit::Minute,
109 "h" => TimeUnit::Hour,
110 "hr" => TimeUnit::Hour,
111 "hrs" => TimeUnit::Hour,
112 "heure" => TimeUnit::Hour,
113 "heures" => TimeUnit::Hour,
114 "jour" => TimeUnit::Day,
115 "jours" => TimeUnit::Day,
116 "semaine" => TimeUnit::Week,
117 "semaines" => TimeUnit::Week,
118 "mois" => TimeUnit::Month,
119 "trimestre" => TimeUnit::Quarter,
120 "trimestres" => TimeUnit::Quarter,
121 "an" => TimeUnit::Year,
122 "ans" => TimeUnit::Year,
123 "année" => TimeUnit::Year,
124 "annee" => TimeUnit::Year,
125 "années" => TimeUnit::Year,
126 "annees" => TimeUnit::Year,
127};
128
129pub static CASUAL_DATE_MAP: phf::Map<&'static str, CasualDateType> = phf_map! {
131 "maintenant" => CasualDateType::Now,
132 "aujourd'hui" => CasualDateType::Today,
133 "aujourdhui" => CasualDateType::Today,
134 "ce soir" => CasualDateType::Tonight,
135 "ce matin" => CasualDateType::ThisMorning,
136 "cet après-midi" => CasualDateType::ThisAfternoon,
137 "cet apres-midi" => CasualDateType::ThisAfternoon,
138 "cet aprem" => CasualDateType::ThisAfternoon,
139 "demain" => CasualDateType::Tomorrow,
140 "hier" => CasualDateType::Yesterday,
141 "après-demain" => CasualDateType::Overmorrow,
142 "apres-demain" => CasualDateType::Overmorrow,
143 "après demain" => CasualDateType::Overmorrow,
144 "apres demain" => CasualDateType::Overmorrow,
145 "avant-hier" => CasualDateType::DayBeforeYesterday,
146 "avant hier" => CasualDateType::DayBeforeYesterday,
147};
148
149pub static CASUAL_TIME_MAP: phf::Map<&'static str, CasualTimeType> = phf_map! {
151 "midi" => CasualTimeType::Noon,
152 "minuit" => CasualTimeType::Midnight,
153 "matin" => CasualTimeType::Morning,
154 "matinée" => CasualTimeType::Morning,
155 "matinee" => CasualTimeType::Morning,
156 "après-midi" => CasualTimeType::Afternoon,
157 "apres-midi" => CasualTimeType::Afternoon,
158 "après midi" => CasualTimeType::Afternoon,
159 "apres midi" => CasualTimeType::Afternoon,
160 "soir" => CasualTimeType::Evening,
161 "soirée" => CasualTimeType::Evening,
162 "soiree" => CasualTimeType::Evening,
163 "nuit" => CasualTimeType::Night,
164};
165
166pub static RELATIVE_MODIFIER_MAP: phf::Map<&'static str, RelativeModifier> = phf_map! {
168 "ce" => RelativeModifier::This,
169 "cette" => RelativeModifier::This,
170 "cet" => RelativeModifier::This,
171 "ces" => RelativeModifier::This,
172 "prochain" => RelativeModifier::Next,
173 "prochaine" => RelativeModifier::Next,
174 "prochains" => RelativeModifier::Next,
175 "prochaines" => RelativeModifier::Next,
176 "suivant" => RelativeModifier::Next,
177 "suivante" => RelativeModifier::Next,
178 "dernier" => RelativeModifier::Last,
179 "dernière" => RelativeModifier::Last,
180 "derniere" => RelativeModifier::Last,
181 "derniers" => RelativeModifier::Last,
182 "dernières" => RelativeModifier::Last,
183 "dernieres" => RelativeModifier::Last,
184 "passé" => RelativeModifier::Last,
185 "passe" => RelativeModifier::Last,
186 "passée" => RelativeModifier::Last,
187 "passee" => RelativeModifier::Last,
188 "précédent" => RelativeModifier::Last,
189 "precedent" => RelativeModifier::Last,
190 "précédente" => RelativeModifier::Last,
191 "precedente" => RelativeModifier::Last,
192};
193
194#[inline]
199pub fn get_weekday(s: &str) -> Option<Weekday> {
200 WEEKDAY_MAP.get(s).copied()
201}
202
203#[inline]
204pub fn get_month(s: &str) -> Option<u32> {
205 MONTH_MAP.get(s).copied()
206}
207
208#[inline]
209pub fn get_integer_word(s: &str) -> Option<f64> {
210 INTEGER_WORD_MAP.get(s).copied()
211}
212
213#[inline]
214pub fn get_time_unit(s: &str) -> Option<TimeUnit> {
215 TIME_UNIT_MAP.get(s).copied()
216}
217
218#[inline]
219pub fn get_casual_date(s: &str) -> Option<CasualDateType> {
220 CASUAL_DATE_MAP.get(s).copied()
221}
222
223#[inline]
224pub fn get_casual_time(s: &str) -> Option<CasualTimeType> {
225 CASUAL_TIME_MAP.get(s).copied()
226}
227
228#[inline]
229pub fn get_relative_modifier(s: &str) -> Option<RelativeModifier> {
230 RELATIVE_MODIFIER_MAP.get(s).copied()
231}
232
233pub fn parse_number_pattern(text: &str) -> f64 {
235 let lower = text.to_lowercase();
236
237 if let Some(val) = get_integer_word(&lower) {
238 return val;
239 }
240
241 match lower.as_str() {
242 s if s.contains("quelques") => return 3.0,
243 s if s.contains("demi") => return 0.5,
244 _ => {}
245 }
246
247 text.parse::<f64>().unwrap_or(0.0)
248}