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::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
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 "трав" => 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
107pub 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
142pub 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
180pub 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
192pub 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
210pub 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#[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
271pub 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}