1use super::{CasualDateType, CasualTimeType, RelativeModifier, TimeUnit, Weekday};
4use phf::phf_map;
5
6pub static WEEKDAY_MAP: phf::Map<&'static str, Weekday> = phf_map! {
8 "sonntag" => Weekday::Sunday,
9 "so" => Weekday::Sunday,
10 "so." => Weekday::Sunday,
11 "montag" => Weekday::Monday,
12 "mo" => Weekday::Monday,
13 "mo." => Weekday::Monday,
14 "dienstag" => Weekday::Tuesday,
15 "di" => Weekday::Tuesday,
16 "di." => Weekday::Tuesday,
17 "mittwoch" => Weekday::Wednesday,
18 "mi" => Weekday::Wednesday,
19 "mi." => Weekday::Wednesday,
20 "donnerstag" => Weekday::Thursday,
21 "do" => Weekday::Thursday,
22 "do." => Weekday::Thursday,
23 "freitag" => Weekday::Friday,
24 "fr" => Weekday::Friday,
25 "fr." => Weekday::Friday,
26 "samstag" => Weekday::Saturday,
27 "sa" => Weekday::Saturday,
28 "sa." => Weekday::Saturday,
29};
30
31pub static MONTH_MAP: phf::Map<&'static str, u32> = phf_map! {
33 "januar" => 1,
34 "jänner" => 1,
35 "janner" => 1,
36 "jan" => 1,
37 "jan." => 1,
38 "februar" => 2,
39 "feber" => 2,
40 "feb" => 2,
41 "feb." => 2,
42 "märz" => 3,
43 "maerz" => 3,
44 "mär" => 3,
45 "mär." => 3,
46 "mrz" => 3,
47 "mrz." => 3,
48 "april" => 4,
49 "apr" => 4,
50 "apr." => 4,
51 "mai" => 5,
52 "juni" => 6,
53 "jun" => 6,
54 "jun." => 6,
55 "juli" => 7,
56 "jul" => 7,
57 "jul." => 7,
58 "august" => 8,
59 "aug" => 8,
60 "aug." => 8,
61 "september" => 9,
62 "sep" => 9,
63 "sep." => 9,
64 "sept" => 9,
65 "sept." => 9,
66 "oktober" => 10,
67 "okt" => 10,
68 "okt." => 10,
69 "november" => 11,
70 "nov" => 11,
71 "nov." => 11,
72 "dezember" => 12,
73 "dez" => 12,
74 "dez." => 12,
75};
76
77pub static INTEGER_WORD_MAP: phf::Map<&'static str, f64> = phf_map! {
79 "eins" => 1.0,
80 "eine" => 1.0,
81 "einem" => 1.0,
82 "einen" => 1.0,
83 "einer" => 1.0,
84 "ein" => 1.0,
85 "zwei" => 2.0,
86 "drei" => 3.0,
87 "vier" => 4.0,
88 "fünf" => 5.0,
89 "fuenf" => 5.0,
90 "sechs" => 6.0,
91 "sieben" => 7.0,
92 "acht" => 8.0,
93 "neun" => 9.0,
94 "zehn" => 10.0,
95 "elf" => 11.0,
96 "zwölf" => 12.0,
97 "zwoelf" => 12.0,
98};
99
100pub static TIME_UNIT_MAP: phf::Map<&'static str, TimeUnit> = phf_map! {
102 "sek" => TimeUnit::Second,
103 "sekunde" => TimeUnit::Second,
104 "sekunden" => TimeUnit::Second,
105 "min" => TimeUnit::Minute,
106 "minute" => TimeUnit::Minute,
107 "minuten" => TimeUnit::Minute,
108 "h" => TimeUnit::Hour,
109 "std" => TimeUnit::Hour,
110 "stunde" => TimeUnit::Hour,
111 "stunden" => TimeUnit::Hour,
112 "tag" => TimeUnit::Day,
113 "tage" => TimeUnit::Day,
114 "tagen" => TimeUnit::Day,
115 "woche" => TimeUnit::Week,
116 "wochen" => TimeUnit::Week,
117 "monat" => TimeUnit::Month,
118 "monate" => TimeUnit::Month,
119 "monaten" => TimeUnit::Month,
120 "monats" => TimeUnit::Month,
121 "quartal" => TimeUnit::Quarter,
122 "quartals" => TimeUnit::Quarter,
123 "quartale" => TimeUnit::Quarter,
124 "quartalen" => TimeUnit::Quarter,
125 "a" => TimeUnit::Year,
126 "j" => TimeUnit::Year,
127 "jr" => TimeUnit::Year,
128 "jahr" => TimeUnit::Year,
129 "jahre" => TimeUnit::Year,
130 "jahren" => TimeUnit::Year,
131 "jahres" => TimeUnit::Year,
132};
133
134pub static CASUAL_DATE_MAP: phf::Map<&'static str, CasualDateType> = phf_map! {
136 "jetzt" => CasualDateType::Now,
137 "heute" => CasualDateType::Today,
138 "heute nacht" => CasualDateType::Tonight,
139 "morgen" => CasualDateType::Tomorrow,
140 "gestern" => CasualDateType::Yesterday,
141 "übermorgen" => CasualDateType::Overmorrow,
142 "uebermorgen" => CasualDateType::Overmorrow,
143 "vorgestern" => CasualDateType::DayBeforeYesterday,
144};
145
146pub static CASUAL_TIME_MAP: phf::Map<&'static str, CasualTimeType> = phf_map! {
148 "mittag" => CasualTimeType::Noon,
149 "mitternacht" => CasualTimeType::Midnight,
150 "morgen" => CasualTimeType::Morning,
151 "morgens" => CasualTimeType::Morning,
152 "vormittag" => CasualTimeType::Morning,
153 "vormittags" => CasualTimeType::Morning,
154 "nachmittag" => CasualTimeType::Afternoon,
155 "nachmittags" => CasualTimeType::Afternoon,
156 "abend" => CasualTimeType::Evening,
157 "abends" => CasualTimeType::Evening,
158 "nacht" => CasualTimeType::Night,
159 "nachts" => CasualTimeType::Night,
160};
161
162pub static RELATIVE_MODIFIER_MAP: phf::Map<&'static str, RelativeModifier> = phf_map! {
164 "dieser" => RelativeModifier::This,
165 "diese" => RelativeModifier::This,
166 "diesen" => RelativeModifier::This,
167 "dieses" => RelativeModifier::This,
168 "nächster" => RelativeModifier::Next,
169 "nächste" => RelativeModifier::Next,
170 "nächsten" => RelativeModifier::Next,
171 "nächstes" => RelativeModifier::Next,
172 "naechster" => RelativeModifier::Next,
173 "naechste" => RelativeModifier::Next,
174 "naechsten" => RelativeModifier::Next,
175 "naechstes" => RelativeModifier::Next,
176 "kommender" => RelativeModifier::Next,
177 "kommende" => RelativeModifier::Next,
178 "kommenden" => RelativeModifier::Next,
179 "kommendes" => RelativeModifier::Next,
180 "letzter" => RelativeModifier::Last,
181 "letzte" => RelativeModifier::Last,
182 "letzten" => RelativeModifier::Last,
183 "letztes" => RelativeModifier::Last,
184 "vergangener" => RelativeModifier::Last,
185 "vergangene" => RelativeModifier::Last,
186 "vergangenen" => RelativeModifier::Last,
187 "vergangenes" => RelativeModifier::Last,
188 "voriger" => RelativeModifier::Last,
189 "vorige" => RelativeModifier::Last,
190 "vorigen" => RelativeModifier::Last,
191 "voriges" => 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("wenige") => return 2.0,
243 s if s.contains("paar") => return 2.0,
244 s if s.contains("halb") || s.contains("halben") => return 0.5,
245 s if s.contains("einig") => return 3.0,
246 s if s.contains("mehre") => return 7.0,
247 _ => {}
248 }
249
250 text.parse::<f64>().unwrap_or(0.0)
251}