Skip to main content

whichtime_sys/dictionaries/
uk.rs

1//! Ukrainian (Українська) 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::Monday,
14    "понеділка" => Weekday::Monday,
15    "пн" => Weekday::Monday,
16    "пн." => Weekday::Monday,
17    "вівторок" => Weekday::Tuesday,
18    "вівторка" => Weekday::Tuesday,
19    "вт" => Weekday::Tuesday,
20    "вт." => Weekday::Tuesday,
21    "середа" => Weekday::Wednesday,
22    "середу" => Weekday::Wednesday,
23    "середи" => Weekday::Wednesday,
24    "ср" => Weekday::Wednesday,
25    "ср." => Weekday::Wednesday,
26    "четвер" => Weekday::Thursday,
27    "четверга" => Weekday::Thursday,
28    "чт" => Weekday::Thursday,
29    "чт." => Weekday::Thursday,
30    "п'ятниця" => Weekday::Friday,
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    "трав" => 5,
69    "трав." => 5,
70    "червень" => 6,
71    "червня" => 6,
72    "червні" => 6,
73    "черв" => 6,
74    "черв." => 6,
75    "липень" => 7,
76    "липня" => 7,
77    "липні" => 7,
78    "лип" => 7,
79    "лип." => 7,
80    "серпень" => 8,
81    "серпня" => 8,
82    "серпні" => 8,
83    "серп" => 8,
84    "серп." => 8,
85    "вересень" => 9,
86    "вересня" => 9,
87    "вересні" => 9,
88    "вер" => 9,
89    "вер." => 9,
90    "жовтень" => 10,
91    "жовтня" => 10,
92    "жовтні" => 10,
93    "жовт" => 10,
94    "жовт." => 10,
95    "листопад" => 11,
96    "листопада" => 11,
97    "листопаді" => 11,
98    "лист" => 11,
99    "лист." => 11,
100    "грудень" => 12,
101    "грудня" => 12,
102    "грудні" => 12,
103    "груд" => 12,
104    "груд." => 12,
105};
106
107/// Integer words dictionary (includes various cases)
108pub static INTEGER_WORD_MAP: phf::Map<&'static str, f64> = phf_map! {
109    "один" => 1.0,
110    "одна" => 1.0,
111    "одну" => 1.0,
112    "одного" => 1.0,
113    "два" => 2.0,
114    "дві" => 2.0,
115    "двох" => 2.0,
116    "три" => 3.0,
117    "трьох" => 3.0,
118    "чотири" => 4.0,
119    "чотирьох" => 4.0,
120    "п'ять" => 5.0,
121    "пять" => 5.0,
122    "п'яти" => 5.0,
123    "пяти" => 5.0,
124    "шість" => 6.0,
125    "шести" => 6.0,
126    "сім" => 7.0,
127    "семи" => 7.0,
128    "вісім" => 8.0,
129    "восьми" => 8.0,
130    "дев'ять" => 9.0,
131    "девять" => 9.0,
132    "дев'яти" => 9.0,
133    "девяти" => 9.0,
134    "десять" => 10.0,
135    "десяти" => 10.0,
136    "одинадцять" => 11.0,
137    "одинадцяти" => 11.0,
138    "дванадцять" => 12.0,
139    "дванадцяти" => 12.0,
140};
141
142/// Time unit dictionary (includes various cases)
143pub static TIME_UNIT_MAP: phf::Map<&'static str, TimeUnit> = phf_map! {
144    "сек" => TimeUnit::Second,
145    "секунда" => TimeUnit::Second,
146    "секунд" => TimeUnit::Second,
147    "секунди" => TimeUnit::Second,
148    "секунду" => TimeUnit::Second,
149    "хв" => TimeUnit::Minute,
150    "хвилина" => TimeUnit::Minute,
151    "хвилин" => TimeUnit::Minute,
152    "хвилини" => TimeUnit::Minute,
153    "хвилину" => TimeUnit::Minute,
154    "год" => TimeUnit::Hour,
155    "година" => TimeUnit::Hour,
156    "годин" => TimeUnit::Hour,
157    "години" => TimeUnit::Hour,
158    "годину" => TimeUnit::Hour,
159    "день" => TimeUnit::Day,
160    "дня" => TimeUnit::Day,
161    "днів" => TimeUnit::Day,
162    "дні" => TimeUnit::Day,
163    "тиждень" => TimeUnit::Week,
164    "тижня" => TimeUnit::Week,
165    "тижнів" => TimeUnit::Week,
166    "тижні" => TimeUnit::Week,
167    "місяць" => TimeUnit::Month,
168    "місяця" => TimeUnit::Month,
169    "місяців" => TimeUnit::Month,
170    "місяці" => TimeUnit::Month,
171    "квартал" => TimeUnit::Quarter,
172    "кварталу" => TimeUnit::Quarter,
173    "кварталів" => TimeUnit::Quarter,
174    "рік" => TimeUnit::Year,
175    "року" => TimeUnit::Year,
176    "років" => TimeUnit::Year,
177    "роки" => TimeUnit::Year,
178};
179
180/// Casual date keywords
181pub static CASUAL_DATE_MAP: phf::Map<&'static str, CasualDateType> = phf_map! {
182    "зараз" => CasualDateType::Now,
183    "сьогодні" => CasualDateType::Today,
184    "сьогодни" => CasualDateType::Today,
185    "сьогодні ввечері" => CasualDateType::Tonight,
186    "завтра" => CasualDateType::Tomorrow,
187    "вчора" => CasualDateType::Yesterday,
188    "післязавтра" => CasualDateType::Overmorrow,
189    "позавчора" => CasualDateType::DayBeforeYesterday,
190};
191
192/// Casual time keywords
193pub static CASUAL_TIME_MAP: phf::Map<&'static str, CasualTimeType> = phf_map! {
194    "полудень" => CasualTimeType::Noon,
195    "опівдні" => CasualTimeType::Noon,
196    "північ" => CasualTimeType::Midnight,
197    "опівночі" => CasualTimeType::Midnight,
198    "ранок" => CasualTimeType::Morning,
199    "вранці" => CasualTimeType::Morning,
200    "зранку" => CasualTimeType::Morning,
201    "день" => CasualTimeType::Afternoon,
202    "вдень" => CasualTimeType::Afternoon,
203    "вечір" => CasualTimeType::Evening,
204    "ввечері" => CasualTimeType::Evening,
205    "увечері" => CasualTimeType::Evening,
206    "ніч" => CasualTimeType::Night,
207    "вночі" => CasualTimeType::Night,
208};
209
210/// Relative modifiers
211pub static RELATIVE_MODIFIER_MAP: phf::Map<&'static str, RelativeModifier> = phf_map! {
212    "цей" => RelativeModifier::This,
213    "ця" => RelativeModifier::This,
214    "це" => RelativeModifier::This,
215    "цю" => RelativeModifier::This,
216    "наступний" => RelativeModifier::Next,
217    "наступна" => RelativeModifier::Next,
218    "наступне" => RelativeModifier::Next,
219    "наступну" => RelativeModifier::Next,
220    "майбутній" => RelativeModifier::Next,
221    "майбутня" => RelativeModifier::Next,
222    "минулий" => RelativeModifier::Last,
223    "минула" => RelativeModifier::Last,
224    "минуле" => RelativeModifier::Last,
225    "минулу" => RelativeModifier::Last,
226    "попередній" => RelativeModifier::Last,
227    "попередня" => RelativeModifier::Last,
228    "останній" => RelativeModifier::Last,
229    "остання" => RelativeModifier::Last,
230};
231
232// ============================================================================
233// Lookup functions
234// ============================================================================
235
236#[inline]
237pub fn get_weekday(s: &str) -> Option<Weekday> {
238    WEEKDAY_MAP.get(s).copied()
239}
240
241#[inline]
242pub fn get_month(s: &str) -> Option<u32> {
243    MONTH_MAP.get(s).copied()
244}
245
246#[inline]
247pub fn get_integer_word(s: &str) -> Option<f64> {
248    INTEGER_WORD_MAP.get(s).copied()
249}
250
251#[inline]
252pub fn get_time_unit(s: &str) -> Option<TimeUnit> {
253    TIME_UNIT_MAP.get(s).copied()
254}
255
256#[inline]
257pub fn get_casual_date(s: &str) -> Option<CasualDateType> {
258    CASUAL_DATE_MAP.get(s).copied()
259}
260
261#[inline]
262pub fn get_casual_time(s: &str) -> Option<CasualTimeType> {
263    CASUAL_TIME_MAP.get(s).copied()
264}
265
266#[inline]
267pub fn get_relative_modifier(s: &str) -> Option<RelativeModifier> {
268    RELATIVE_MODIFIER_MAP.get(s).copied()
269}
270
271/// Parse a number pattern
272pub fn parse_number_pattern(text: &str) -> f64 {
273    let lower = text.to_lowercase();
274
275    if let Some(val) = get_integer_word(&lower) {
276        return val;
277    }
278
279    match lower.as_str() {
280        s if s.contains("кілька") || s.contains("декілька") => return 3.0,
281        s if s.contains("пів") => return 0.5,
282        s if s.contains("пар") => return 2.0,
283        s if s.trim().is_empty() => return 1.0,
284        _ => {}
285    }
286
287    text.parse::<f64>().unwrap_or(0.0)
288}