1use super::{CasualDateType, CasualTimeType, RelativeModifier, TimeUnit, Weekday};
4use phf::phf_map;
5
6pub static WEEKDAY_MAP: phf::Map<&'static str, Weekday> = phf_map! {
8 "воскресенье" => Weekday::Sunday,
9 "воскресенья" => Weekday::Sunday,
10 "вск" => Weekday::Sunday,
11 "вск." => Weekday::Sunday,
12 "вс" => Weekday::Sunday,
13 "вс." => Weekday::Sunday,
14 "понедельник" => Weekday::Monday,
15 "понедельника" => Weekday::Monday,
16 "пн" => Weekday::Monday,
17 "пн." => Weekday::Monday,
18 "вторник" => Weekday::Tuesday,
19 "вторника" => Weekday::Tuesday,
20 "вт" => Weekday::Tuesday,
21 "вт." => Weekday::Tuesday,
22 "среда" => Weekday::Wednesday,
23 "среды" => Weekday::Wednesday,
24 "среду" => Weekday::Wednesday,
25 "ср" => Weekday::Wednesday,
26 "ср." => Weekday::Wednesday,
27 "четверг" => Weekday::Thursday,
28 "четверга" => Weekday::Thursday,
29 "чт" => Weekday::Thursday,
30 "чт." => Weekday::Thursday,
31 "пятница" => Weekday::Friday,
32 "пятницу" => Weekday::Friday,
33 "пятницы" => Weekday::Friday,
34 "пт" => Weekday::Friday,
35 "пт." => Weekday::Friday,
36 "суббота" => Weekday::Saturday,
37 "субботу" => Weekday::Saturday,
38 "субботы" => Weekday::Saturday,
39 "сб" => Weekday::Saturday,
40 "сб." => Weekday::Saturday,
41};
42
43pub static MONTH_MAP: phf::Map<&'static str, u32> = phf_map! {
45 "январь" => 1,
46 "января" => 1,
47 "январе" => 1,
48 "янв" => 1,
49 "янв." => 1,
50 "февраль" => 2,
51 "февраля" => 2,
52 "феврале" => 2,
53 "фев" => 2,
54 "фев." => 2,
55 "март" => 3,
56 "марта" => 3,
57 "марте" => 3,
58 "мар" => 3,
59 "мар." => 3,
60 "апрель" => 4,
61 "апреля" => 4,
62 "апреле" => 4,
63 "апр" => 4,
64 "апр." => 4,
65 "май" => 5,
66 "мая" => 5,
67 "мае" => 5,
68 "июнь" => 6,
69 "июня" => 6,
70 "июне" => 6,
71 "июль" => 7,
72 "июля" => 7,
73 "июле" => 7,
74 "август" => 8,
75 "августа" => 8,
76 "августе" => 8,
77 "авг" => 8,
78 "авг." => 8,
79 "сентябрь" => 9,
80 "сентября" => 9,
81 "сентябре" => 9,
82 "сен" => 9,
83 "сен." => 9,
84 "октябрь" => 10,
85 "октября" => 10,
86 "октябре" => 10,
87 "окт" => 10,
88 "окт." => 10,
89 "ноябрь" => 11,
90 "ноября" => 11,
91 "ноябре" => 11,
92 "ноя" => 11,
93 "ноя." => 11,
94 "декабрь" => 12,
95 "декабря" => 12,
96 "декабре" => 12,
97 "дек" => 12,
98 "дек." => 12,
99};
100
101pub static INTEGER_WORD_MAP: phf::Map<&'static str, f64> = phf_map! {
103 "один" => 1.0,
104 "одна" => 1.0,
105 "одной" => 1.0,
106 "одну" => 1.0,
107 "одного" => 1.0,
108 "две" => 2.0,
109 "два" => 2.0,
110 "двух" => 2.0,
111 "три" => 3.0,
112 "трех" => 3.0,
113 "трёх" => 3.0,
114 "четыре" => 4.0,
115 "четырех" => 4.0,
116 "четырёх" => 4.0,
117 "пять" => 5.0,
118 "пяти" => 5.0,
119 "шесть" => 6.0,
120 "шести" => 6.0,
121 "семь" => 7.0,
122 "семи" => 7.0,
123 "восемь" => 8.0,
124 "восьми" => 8.0,
125 "девять" => 9.0,
126 "девяти" => 9.0,
127 "десять" => 10.0,
128 "десяти" => 10.0,
129 "одиннадцать" => 11.0,
130 "одиннадцати" => 11.0,
131 "двенадцать" => 12.0,
132 "двенадцати" => 12.0,
133};
134
135pub static ORDINAL_WORD_MAP: phf::Map<&'static str, u32> = phf_map! {
137 "первое" => 1,
138 "первого" => 1,
139 "второе" => 2,
140 "второго" => 2,
141 "третье" => 3,
142 "третьего" => 3,
143 "четвертое" => 4,
144 "четвертого" => 4,
145 "пятое" => 5,
146 "пятого" => 5,
147 "шестое" => 6,
148 "шестого" => 6,
149 "седьмое" => 7,
150 "седьмого" => 7,
151 "восьмое" => 8,
152 "восьмого" => 8,
153 "девятое" => 9,
154 "девятого" => 9,
155 "десятое" => 10,
156 "десятого" => 10,
157};
158
159pub static TIME_UNIT_MAP: phf::Map<&'static str, TimeUnit> = phf_map! {
161 "сек" => TimeUnit::Second,
162 "секунда" => TimeUnit::Second,
163 "секунд" => TimeUnit::Second,
164 "секунды" => TimeUnit::Second,
165 "секунду" => TimeUnit::Second,
166 "секундочка" => TimeUnit::Second,
167 "секундочки" => TimeUnit::Second,
168 "мин" => TimeUnit::Minute,
169 "минута" => TimeUnit::Minute,
170 "минут" => TimeUnit::Minute,
171 "минуты" => TimeUnit::Minute,
172 "минуту" => TimeUnit::Minute,
173 "минутка" => TimeUnit::Minute,
174 "минуток" => TimeUnit::Minute,
175 "час" => TimeUnit::Hour,
176 "часов" => TimeUnit::Hour,
177 "часа" => TimeUnit::Hour,
178 "часу" => TimeUnit::Hour,
179 "часик" => TimeUnit::Hour,
180 "часиков" => TimeUnit::Hour,
181 "день" => TimeUnit::Day,
182 "дня" => TimeUnit::Day,
183 "дней" => TimeUnit::Day,
184 "суток" => TimeUnit::Day,
185 "сутки" => TimeUnit::Day,
186 "неделя" => TimeUnit::Week,
187 "неделе" => TimeUnit::Week,
188 "недели" => TimeUnit::Week,
189 "неделю" => TimeUnit::Week,
190 "недель" => TimeUnit::Week,
191 "месяц" => TimeUnit::Month,
192 "месяце" => TimeUnit::Month,
193 "месяцев" => TimeUnit::Month,
194 "месяца" => TimeUnit::Month,
195 "квартал" => TimeUnit::Quarter,
196 "квартале" => TimeUnit::Quarter,
197 "кварталов" => TimeUnit::Quarter,
198 "год" => TimeUnit::Year,
199 "года" => TimeUnit::Year,
200 "году" => TimeUnit::Year,
201 "годов" => TimeUnit::Year,
202 "лет" => TimeUnit::Year,
203 "годик" => TimeUnit::Year,
204 "годика" => TimeUnit::Year,
205};
206
207pub static CASUAL_DATE_MAP: phf::Map<&'static str, CasualDateType> = phf_map! {
209 "сейчас" => CasualDateType::Now,
210 "сегодня" => CasualDateType::Today,
211 "сегодня ночью" => CasualDateType::Tonight,
212 "сегодня вечером" => CasualDateType::Tonight,
213 "завтра" => CasualDateType::Tomorrow,
214 "вчера" => CasualDateType::Yesterday,
215 "послезавтра" => CasualDateType::Overmorrow,
216 "позавчера" => CasualDateType::DayBeforeYesterday,
217};
218
219pub static CASUAL_TIME_MAP: phf::Map<&'static str, CasualTimeType> = phf_map! {
221 "полдень" => CasualTimeType::Noon,
222 "полудень" => CasualTimeType::Noon,
223 "полночь" => CasualTimeType::Midnight,
224 "утро" => CasualTimeType::Morning,
225 "утром" => CasualTimeType::Morning,
226 "день" => CasualTimeType::Afternoon,
227 "днем" => CasualTimeType::Afternoon,
228 "днём" => CasualTimeType::Afternoon,
229 "вечер" => CasualTimeType::Evening,
230 "вечером" => CasualTimeType::Evening,
231 "ночь" => CasualTimeType::Night,
232 "ночью" => CasualTimeType::Night,
233};
234
235pub static RELATIVE_MODIFIER_MAP: phf::Map<&'static str, RelativeModifier> = phf_map! {
237 "этот" => RelativeModifier::This,
238 "эта" => RelativeModifier::This,
239 "это" => RelativeModifier::This,
240 "эту" => RelativeModifier::This,
241 "следующий" => RelativeModifier::Next,
242 "следующая" => RelativeModifier::Next,
243 "следующее" => RelativeModifier::Next,
244 "следующую" => RelativeModifier::Next,
245 "будущий" => RelativeModifier::Next,
246 "будущая" => RelativeModifier::Next,
247 "будущее" => RelativeModifier::Next,
248 "прошлый" => RelativeModifier::Last,
249 "прошлая" => RelativeModifier::Last,
250 "прошлое" => RelativeModifier::Last,
251 "прошлую" => RelativeModifier::Last,
252 "предыдущий" => RelativeModifier::Last,
253 "предыдущая" => RelativeModifier::Last,
254 "предыдущее" => RelativeModifier::Last,
255 "последний" => RelativeModifier::Last,
256 "последняя" => RelativeModifier::Last,
257};
258
259#[inline]
264pub fn get_weekday(s: &str) -> Option<Weekday> {
265 WEEKDAY_MAP.get(s).copied()
266}
267
268#[inline]
269pub fn get_month(s: &str) -> Option<u32> {
270 MONTH_MAP.get(s).copied()
271}
272
273#[inline]
274pub fn get_integer_word(s: &str) -> Option<f64> {
275 INTEGER_WORD_MAP.get(s).copied()
276}
277
278#[inline]
279pub fn get_ordinal_word(s: &str) -> Option<u32> {
280 ORDINAL_WORD_MAP.get(s).copied()
281}
282
283#[inline]
284pub fn get_time_unit(s: &str) -> Option<TimeUnit> {
285 TIME_UNIT_MAP.get(s).copied()
286}
287
288#[inline]
289pub fn get_casual_date(s: &str) -> Option<CasualDateType> {
290 CASUAL_DATE_MAP.get(s).copied()
291}
292
293#[inline]
294pub fn get_casual_time(s: &str) -> Option<CasualTimeType> {
295 CASUAL_TIME_MAP.get(s).copied()
296}
297
298#[inline]
299pub fn get_relative_modifier(s: &str) -> Option<RelativeModifier> {
300 RELATIVE_MODIFIER_MAP.get(s).copied()
301}
302
303pub fn parse_number_pattern(text: &str) -> f64 {
305 let lower = text.to_lowercase();
306
307 if let Some(val) = get_integer_word(&lower) {
308 return val;
309 }
310
311 match lower.as_str() {
312 s if s.contains("несколько") => return 3.0,
313 s if s.contains("пол") => return 0.5,
314 s if s.contains("пар") => return 2.0,
315 s if s.trim().is_empty() => return 1.0,
316 _ => {}
317 }
318
319 text.parse::<f64>().unwrap_or(0.0)
320}
321
322pub fn parse_ordinal_pattern(text: &str) -> Option<u32> {
324 let lower = text.to_lowercase();
325
326 if let Some(val) = get_ordinal_word(&lower) {
327 return Some(val);
328 }
329
330 let cleaned = lower
331 .trim_end_matches("го")
332 .trim_end_matches("ого")
333 .trim_end_matches("е")
334 .trim_end_matches("ое");
335
336 cleaned.parse::<u32>().ok()
337}