Skip to main content

whichtime_sys/dictionaries/
nl.rs

1//! Dutch (Nederlands) 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    "zondag" => Weekday::Sunday,
9    "zon" => Weekday::Sunday,
10    "zo" => Weekday::Sunday,
11    "zo." => Weekday::Sunday,
12    "maandag" => Weekday::Monday,
13    "maan" => Weekday::Monday,
14    "ma" => Weekday::Monday,
15    "ma." => Weekday::Monday,
16    "dinsdag" => Weekday::Tuesday,
17    "dins" => Weekday::Tuesday,
18    "di" => Weekday::Tuesday,
19    "di." => Weekday::Tuesday,
20    "woensdag" => Weekday::Wednesday,
21    "woens" => Weekday::Wednesday,
22    "wo" => Weekday::Wednesday,
23    "wo." => Weekday::Wednesday,
24    "donderdag" => Weekday::Thursday,
25    "donder" => Weekday::Thursday,
26    "do" => Weekday::Thursday,
27    "do." => Weekday::Thursday,
28    "vrijdag" => Weekday::Friday,
29    "vrij" => Weekday::Friday,
30    "vr" => Weekday::Friday,
31    "vr." => Weekday::Friday,
32    "zaterdag" => Weekday::Saturday,
33    "zater" => Weekday::Saturday,
34    "za" => Weekday::Saturday,
35    "za." => Weekday::Saturday,
36};
37
38/// Month dictionary
39pub static MONTH_MAP: phf::Map<&'static str, u32> = phf_map! {
40    "januari" => 1,
41    "jan" => 1,
42    "jan." => 1,
43    "februari" => 2,
44    "feb" => 2,
45    "feb." => 2,
46    "maart" => 3,
47    "mrt" => 3,
48    "mrt." => 3,
49    "april" => 4,
50    "apr" => 4,
51    "apr." => 4,
52    "mei" => 5,
53    "juni" => 6,
54    "jun" => 6,
55    "jun." => 6,
56    "juli" => 7,
57    "jul" => 7,
58    "jul." => 7,
59    "augustus" => 8,
60    "aug" => 8,
61    "aug." => 8,
62    "september" => 9,
63    "sep" => 9,
64    "sep." => 9,
65    "sept" => 9,
66    "sept." => 9,
67    "oktober" => 10,
68    "okt" => 10,
69    "okt." => 10,
70    "november" => 11,
71    "nov" => 11,
72    "nov." => 11,
73    "december" => 12,
74    "dec" => 12,
75    "dec." => 12,
76};
77
78/// Integer words dictionary
79pub static INTEGER_WORD_MAP: phf::Map<&'static str, f64> = phf_map! {
80    "een" => 1.0,
81    "één" => 1.0,
82    "twee" => 2.0,
83    "drie" => 3.0,
84    "vier" => 4.0,
85    "vijf" => 5.0,
86    "zes" => 6.0,
87    "zeven" => 7.0,
88    "acht" => 8.0,
89    "negen" => 9.0,
90    "tien" => 10.0,
91    "elf" => 11.0,
92    "twaalf" => 12.0,
93};
94
95/// Time unit dictionary
96pub static TIME_UNIT_MAP: phf::Map<&'static str, TimeUnit> = phf_map! {
97    "sec" => TimeUnit::Second,
98    "seconde" => TimeUnit::Second,
99    "seconden" => TimeUnit::Second,
100    "secondes" => TimeUnit::Second,
101    "min" => TimeUnit::Minute,
102    "mins" => TimeUnit::Minute,
103    "minuut" => TimeUnit::Minute,
104    "minuten" => TimeUnit::Minute,
105    "u" => TimeUnit::Hour,
106    "uur" => TimeUnit::Hour,
107    "uren" => TimeUnit::Hour,
108    "dag" => TimeUnit::Day,
109    "dagen" => TimeUnit::Day,
110    "week" => TimeUnit::Week,
111    "weken" => TimeUnit::Week,
112    "maand" => TimeUnit::Month,
113    "maanden" => TimeUnit::Month,
114    "kwartaal" => TimeUnit::Quarter,
115    "kwartalen" => TimeUnit::Quarter,
116    "jaar" => TimeUnit::Year,
117    "jaren" => TimeUnit::Year,
118};
119
120/// Casual date keywords
121pub static CASUAL_DATE_MAP: phf::Map<&'static str, CasualDateType> = phf_map! {
122    "nu" => CasualDateType::Now,
123    "vandaag" => CasualDateType::Today,
124    "vanavond" => CasualDateType::Tonight,
125    "morgen" => CasualDateType::Tomorrow,
126    "gisteren" => CasualDateType::Yesterday,
127    "overmorgen" => CasualDateType::Overmorrow,
128    "eergisteren" => CasualDateType::DayBeforeYesterday,
129};
130
131/// Casual time keywords
132pub static CASUAL_TIME_MAP: phf::Map<&'static str, CasualTimeType> = phf_map! {
133    "middag" => CasualTimeType::Noon,
134    "twaalf uur" => CasualTimeType::Noon,
135    "middernacht" => CasualTimeType::Midnight,
136    "ochtend" => CasualTimeType::Morning,
137    "'s ochtends" => CasualTimeType::Morning,
138    "namiddag" => CasualTimeType::Afternoon,
139    "'s middags" => CasualTimeType::Afternoon,
140    "avond" => CasualTimeType::Evening,
141    "'s avonds" => CasualTimeType::Evening,
142    "nacht" => CasualTimeType::Night,
143    "'s nachts" => CasualTimeType::Night,
144};
145
146/// Relative modifiers
147pub static RELATIVE_MODIFIER_MAP: phf::Map<&'static str, RelativeModifier> = phf_map! {
148    "deze" => RelativeModifier::This,
149    "dit" => RelativeModifier::This,
150    "volgende" => RelativeModifier::Next,
151    "volgend" => RelativeModifier::Next,
152    "komende" => RelativeModifier::Next,
153    "komend" => RelativeModifier::Next,
154    "afgelopen" => RelativeModifier::Last,
155    "vorige" => RelativeModifier::Last,
156    "vorig" => RelativeModifier::Last,
157    "laatste" => RelativeModifier::Last,
158};
159
160// ============================================================================
161// Lookup functions
162// ============================================================================
163
164#[inline]
165pub fn get_weekday(s: &str) -> Option<Weekday> {
166    WEEKDAY_MAP.get(s).copied()
167}
168
169#[inline]
170pub fn get_month(s: &str) -> Option<u32> {
171    MONTH_MAP.get(s).copied()
172}
173
174#[inline]
175pub fn get_integer_word(s: &str) -> Option<f64> {
176    INTEGER_WORD_MAP.get(s).copied()
177}
178
179#[inline]
180pub fn get_time_unit(s: &str) -> Option<TimeUnit> {
181    TIME_UNIT_MAP.get(s).copied()
182}
183
184#[inline]
185pub fn get_casual_date(s: &str) -> Option<CasualDateType> {
186    CASUAL_DATE_MAP.get(s).copied()
187}
188
189#[inline]
190pub fn get_casual_time(s: &str) -> Option<CasualTimeType> {
191    CASUAL_TIME_MAP.get(s).copied()
192}
193
194#[inline]
195pub fn get_relative_modifier(s: &str) -> Option<RelativeModifier> {
196    RELATIVE_MODIFIER_MAP.get(s).copied()
197}
198
199/// Parse a number pattern
200pub fn parse_number_pattern(text: &str) -> f64 {
201    let lower = text.to_lowercase();
202
203    if let Some(val) = get_integer_word(&lower) {
204        return val;
205    }
206
207    match lower.as_str() {
208        s if s.contains("paar") => return 2.0,
209        s if s.contains("half") => return 0.5,
210        s if s.contains("enkele") || s.contains("enkel") => return 3.0,
211        s if s.contains("meerdere") || s.contains("verschillende") => return 7.0,
212        _ => {}
213    }
214
215    text.parse::<f64>().unwrap_or(0.0)
216}