Skip to main content

whichtime_sys/dictionaries/
fr.rs

1//! French (Français) 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    "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
31/// Month dictionary
32pub 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
82/// Integer words dictionary
83pub 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
100/// Time unit dictionary
101pub 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
129/// Casual date keywords
130pub 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
149/// Casual time keywords
150pub 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
166/// Relative modifiers
167pub 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// ============================================================================
195// Lookup functions
196// ============================================================================
197
198#[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
233/// Parse a number pattern
234pub 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}