1use super::{CasualDateType, CasualTimeType, RelativeModifier, TimeUnit, Weekday};
4use phf::phf_map;
5
6pub static WEEKDAY_MAP: phf::Map<&'static str, Weekday> = phf_map! {
8 "söndag" => Weekday::Sunday,
9 "sondag" => Weekday::Sunday,
10 "sön" => Weekday::Sunday,
11 "son" => Weekday::Sunday,
12 "sön." => Weekday::Sunday,
13 "son." => Weekday::Sunday,
14 "måndag" => Weekday::Monday,
15 "mandag" => Weekday::Monday,
16 "mån" => Weekday::Monday,
17 "man" => Weekday::Monday,
18 "mån." => Weekday::Monday,
19 "man." => Weekday::Monday,
20 "tisdag" => Weekday::Tuesday,
21 "tis" => Weekday::Tuesday,
22 "tis." => Weekday::Tuesday,
23 "onsdag" => Weekday::Wednesday,
24 "ons" => Weekday::Wednesday,
25 "ons." => Weekday::Wednesday,
26 "torsdag" => Weekday::Thursday,
27 "tor" => Weekday::Thursday,
28 "tor." => Weekday::Thursday,
29 "tors" => Weekday::Thursday,
30 "tors." => Weekday::Thursday,
31 "fredag" => Weekday::Friday,
32 "fre" => Weekday::Friday,
33 "fre." => Weekday::Friday,
34 "lördag" => Weekday::Saturday,
35 "lordag" => Weekday::Saturday,
36 "lör" => Weekday::Saturday,
37 "lor" => Weekday::Saturday,
38 "lör." => Weekday::Saturday,
39 "lor." => Weekday::Saturday,
40};
41
42pub static MONTH_MAP: phf::Map<&'static str, u32> = phf_map! {
44 "januari" => 1,
45 "jan" => 1,
46 "jan." => 1,
47 "februari" => 2,
48 "feb" => 2,
49 "feb." => 2,
50 "mars" => 3,
51 "mar" => 3,
52 "mar." => 3,
53 "april" => 4,
54 "apr" => 4,
55 "apr." => 4,
56 "maj" => 5,
57 "juni" => 6,
58 "jun" => 6,
59 "jun." => 6,
60 "juli" => 7,
61 "jul" => 7,
62 "jul." => 7,
63 "augusti" => 8,
64 "aug" => 8,
65 "aug." => 8,
66 "september" => 9,
67 "sep" => 9,
68 "sep." => 9,
69 "sept" => 9,
70 "sept." => 9,
71 "oktober" => 10,
72 "okt" => 10,
73 "okt." => 10,
74 "november" => 11,
75 "nov" => 11,
76 "nov." => 11,
77 "december" => 12,
78 "dec" => 12,
79 "dec." => 12,
80};
81
82pub static INTEGER_WORD_MAP: phf::Map<&'static str, f64> = phf_map! {
84 "en" => 1.0,
85 "ett" => 1.0,
86 "två" => 2.0,
87 "tva" => 2.0,
88 "tre" => 3.0,
89 "fyra" => 4.0,
90 "fem" => 5.0,
91 "sex" => 6.0,
92 "sju" => 7.0,
93 "åtta" => 8.0,
94 "atta" => 8.0,
95 "nio" => 9.0,
96 "tio" => 10.0,
97 "elva" => 11.0,
98 "tolv" => 12.0,
99};
100
101pub static TIME_UNIT_MAP: phf::Map<&'static str, TimeUnit> = phf_map! {
103 "sek" => TimeUnit::Second,
104 "sekund" => TimeUnit::Second,
105 "sekunder" => TimeUnit::Second,
106 "min" => TimeUnit::Minute,
107 "minut" => TimeUnit::Minute,
108 "minuter" => TimeUnit::Minute,
109 "tim" => TimeUnit::Hour,
110 "timme" => TimeUnit::Hour,
111 "timmar" => TimeUnit::Hour,
112 "dag" => TimeUnit::Day,
113 "dagar" => TimeUnit::Day,
114 "vecka" => TimeUnit::Week,
115 "veckor" => TimeUnit::Week,
116 "månad" => TimeUnit::Month,
117 "manad" => TimeUnit::Month,
118 "månader" => TimeUnit::Month,
119 "manader" => TimeUnit::Month,
120 "kvartal" => TimeUnit::Quarter,
121 "år" => TimeUnit::Year,
122 "ar" => TimeUnit::Year,
123};
124
125pub static CASUAL_DATE_MAP: phf::Map<&'static str, CasualDateType> = phf_map! {
127 "nu" => CasualDateType::Now,
128 "idag" => CasualDateType::Today,
129 "i dag" => CasualDateType::Today,
130 "ikväll" => CasualDateType::Tonight,
131 "i kväll" => CasualDateType::Tonight,
132 "ikvall" => CasualDateType::Tonight,
133 "i kvall" => CasualDateType::Tonight,
134 "imorgon" => CasualDateType::Tomorrow,
135 "i morgon" => CasualDateType::Tomorrow,
136 "igår" => CasualDateType::Yesterday,
137 "i går" => CasualDateType::Yesterday,
138 "igar" => CasualDateType::Yesterday,
139 "i gar" => CasualDateType::Yesterday,
140 "övermorgon" => CasualDateType::Overmorrow,
141 "i övermorgon" => CasualDateType::Overmorrow,
142 "overmorgon" => CasualDateType::Overmorrow,
143 "i overmorgon" => CasualDateType::Overmorrow,
144 "förrgår" => CasualDateType::DayBeforeYesterday,
145 "i förrgår" => CasualDateType::DayBeforeYesterday,
146 "forrgar" => CasualDateType::DayBeforeYesterday,
147 "i forrgar" => CasualDateType::DayBeforeYesterday,
148};
149
150pub static CASUAL_TIME_MAP: phf::Map<&'static str, CasualTimeType> = phf_map! {
152 "middag" => CasualTimeType::Noon,
153 "mitt på dagen" => CasualTimeType::Noon,
154 "midnatt" => CasualTimeType::Midnight,
155 "morgon" => CasualTimeType::Morning,
156 "på morgonen" => CasualTimeType::Morning,
157 "eftermiddag" => CasualTimeType::Afternoon,
158 "på eftermiddagen" => CasualTimeType::Afternoon,
159 "kväll" => CasualTimeType::Evening,
160 "kvall" => CasualTimeType::Evening,
161 "på kvällen" => CasualTimeType::Evening,
162 "natt" => CasualTimeType::Night,
163 "på natten" => CasualTimeType::Night,
164};
165
166pub static RELATIVE_MODIFIER_MAP: phf::Map<&'static str, RelativeModifier> = phf_map! {
168 "denna" => RelativeModifier::This,
169 "detta" => RelativeModifier::This,
170 "den här" => RelativeModifier::This,
171 "det här" => RelativeModifier::This,
172 "nästa" => RelativeModifier::Next,
173 "nasta" => RelativeModifier::Next,
174 "kommande" => RelativeModifier::Next,
175 "förra" => RelativeModifier::Last,
176 "forra" => RelativeModifier::Last,
177 "senaste" => RelativeModifier::Last,
178 "sista" => RelativeModifier::Last,
179 "föregående" => RelativeModifier::Last,
180 "foregaende" => RelativeModifier::Last,
181};
182
183#[inline]
188pub fn get_weekday(s: &str) -> Option<Weekday> {
189 WEEKDAY_MAP.get(s).copied()
190}
191
192#[inline]
193pub fn get_month(s: &str) -> Option<u32> {
194 MONTH_MAP.get(s).copied()
195}
196
197#[inline]
198pub fn get_integer_word(s: &str) -> Option<f64> {
199 INTEGER_WORD_MAP.get(s).copied()
200}
201
202#[inline]
203pub fn get_time_unit(s: &str) -> Option<TimeUnit> {
204 TIME_UNIT_MAP.get(s).copied()
205}
206
207#[inline]
208pub fn get_casual_date(s: &str) -> Option<CasualDateType> {
209 CASUAL_DATE_MAP.get(s).copied()
210}
211
212#[inline]
213pub fn get_casual_time(s: &str) -> Option<CasualTimeType> {
214 CASUAL_TIME_MAP.get(s).copied()
215}
216
217#[inline]
218pub fn get_relative_modifier(s: &str) -> Option<RelativeModifier> {
219 RELATIVE_MODIFIER_MAP.get(s).copied()
220}
221
222pub fn parse_number_pattern(text: &str) -> f64 {
224 let lower = text.to_lowercase();
225
226 if let Some(val) = get_integer_word(&lower) {
227 return val;
228 }
229
230 match lower.as_str() {
231 s if s.contains("några") || s.contains("nagra") => return 3.0,
232 s if s.contains("halv") => return 0.5,
233 s if s.contains("par") => return 2.0,
234 s if s.contains("flera") => return 7.0,
235 _ => {}
236 }
237
238 text.parse::<f64>().unwrap_or(0.0)
239}