Skip to main content

whichtime_sys/dictionaries/
ru.rs

1//! Russian (Русский) locale dictionaries
2
3use super::{CasualDateType, CasualTimeType, RelativeModifier, TimeUnit, Weekday};
4use phf::phf_map;
5
6/// Weekday dictionary (includes various cases)
7pub 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
43/// Month dictionary (includes various cases)
44pub 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
101/// Integer words dictionary (includes various cases)
102pub 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
135/// Ordinal words dictionary
136pub 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
159/// Time unit dictionary (includes diminutives and cases)
160pub 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
207/// Casual date keywords
208pub 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
219/// Casual time keywords
220pub 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
235/// Relative modifiers
236pub 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// ============================================================================
260// Lookup functions
261// ============================================================================
262
263#[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
303/// Parse a number pattern
304pub 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
322/// Parse an ordinal number pattern
323pub 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}