Skip to main content

whichtime_sys/dictionaries/
pt.rs

1//! Portuguese (Português) locale dictionaries
2
3use super::{CasualDateType, CasualTimeType, RelativeModifier, TimeUnit, Weekday};
4use phf::phf_map;
5
6/// Weekday dictionary
7pub static WEEKDAY_MAP: phf::Map<&'static str, Weekday> = phf_map! {
8    "domingo" => Weekday::Sunday,
9    "dom" => Weekday::Sunday,
10    "dom." => Weekday::Sunday,
11    "segunda" => Weekday::Monday,
12    "segunda-feira" => Weekday::Monday,
13    "seg" => Weekday::Monday,
14    "seg." => Weekday::Monday,
15    "terça" => Weekday::Tuesday,
16    "terca" => Weekday::Tuesday,
17    "terça-feira" => Weekday::Tuesday,
18    "terca-feira" => Weekday::Tuesday,
19    "ter" => Weekday::Tuesday,
20    "ter." => Weekday::Tuesday,
21    "quarta" => Weekday::Wednesday,
22    "quarta-feira" => Weekday::Wednesday,
23    "qua" => Weekday::Wednesday,
24    "qua." => Weekday::Wednesday,
25    "quinta" => Weekday::Thursday,
26    "quinta-feira" => Weekday::Thursday,
27    "qui" => Weekday::Thursday,
28    "qui." => Weekday::Thursday,
29    "sexta" => Weekday::Friday,
30    "sexta-feira" => Weekday::Friday,
31    "sex" => Weekday::Friday,
32    "sex." => Weekday::Friday,
33    "sábado" => Weekday::Saturday,
34    "sabado" => Weekday::Saturday,
35    "sab" => Weekday::Saturday,
36    "sab." => Weekday::Saturday,
37};
38
39/// Month dictionary
40pub static MONTH_MAP: phf::Map<&'static str, u32> = phf_map! {
41    "janeiro" => 1,
42    "jan" => 1,
43    "jan." => 1,
44    "fevereiro" => 2,
45    "fev" => 2,
46    "fev." => 2,
47    "março" => 3,
48    "marco" => 3,
49    "mar" => 3,
50    "mar." => 3,
51    "abril" => 4,
52    "abr" => 4,
53    "abr." => 4,
54    "maio" => 5,
55    "mai" => 5,
56    "mai." => 5,
57    "junho" => 6,
58    "jun" => 6,
59    "jun." => 6,
60    "julho" => 7,
61    "jul" => 7,
62    "jul." => 7,
63    "agosto" => 8,
64    "ago" => 8,
65    "ago." => 8,
66    "setembro" => 9,
67    "set" => 9,
68    "set." => 9,
69    "outubro" => 10,
70    "out" => 10,
71    "out." => 10,
72    "novembro" => 11,
73    "nov" => 11,
74    "nov." => 11,
75    "dezembro" => 12,
76    "dez" => 12,
77    "dez." => 12,
78};
79
80/// Integer words dictionary
81pub static INTEGER_WORD_MAP: phf::Map<&'static str, f64> = phf_map! {
82    "um" => 1.0,
83    "uma" => 1.0,
84    "dois" => 2.0,
85    "duas" => 2.0,
86    "três" => 3.0,
87    "tres" => 3.0,
88    "quatro" => 4.0,
89    "cinco" => 5.0,
90    "seis" => 6.0,
91    "sete" => 7.0,
92    "oito" => 8.0,
93    "nove" => 9.0,
94    "dez" => 10.0,
95    "onze" => 11.0,
96    "doze" => 12.0,
97};
98
99/// Time unit dictionary
100pub static TIME_UNIT_MAP: phf::Map<&'static str, TimeUnit> = phf_map! {
101    "seg" => TimeUnit::Second,
102    "segundo" => TimeUnit::Second,
103    "segundos" => TimeUnit::Second,
104    "min" => TimeUnit::Minute,
105    "mins" => TimeUnit::Minute,
106    "minuto" => TimeUnit::Minute,
107    "minutos" => TimeUnit::Minute,
108    "h" => TimeUnit::Hour,
109    "hr" => TimeUnit::Hour,
110    "hora" => TimeUnit::Hour,
111    "horas" => TimeUnit::Hour,
112    "dia" => TimeUnit::Day,
113    "dias" => TimeUnit::Day,
114    "semana" => TimeUnit::Week,
115    "semanas" => TimeUnit::Week,
116    "mês" => TimeUnit::Month,
117    "mes" => TimeUnit::Month,
118    "meses" => TimeUnit::Month,
119    "trimestre" => TimeUnit::Quarter,
120    "trimestres" => TimeUnit::Quarter,
121    "ano" => TimeUnit::Year,
122    "anos" => TimeUnit::Year,
123};
124
125/// Casual date keywords
126pub static CASUAL_DATE_MAP: phf::Map<&'static str, CasualDateType> = phf_map! {
127    "agora" => CasualDateType::Now,
128    "hoje" => CasualDateType::Today,
129    "hoje à noite" => CasualDateType::Tonight,
130    "hoje a noite" => CasualDateType::Tonight,
131    "amanhã" => CasualDateType::Tomorrow,
132    "amanha" => CasualDateType::Tomorrow,
133    "ontem" => CasualDateType::Yesterday,
134    "depois de amanhã" => CasualDateType::Overmorrow,
135    "depois de amanha" => CasualDateType::Overmorrow,
136    "anteontem" => CasualDateType::DayBeforeYesterday,
137};
138
139/// Casual time keywords
140pub static CASUAL_TIME_MAP: phf::Map<&'static str, CasualTimeType> = phf_map! {
141    "meio-dia" => CasualTimeType::Noon,
142    "meio dia" => CasualTimeType::Noon,
143    "meia-noite" => CasualTimeType::Midnight,
144    "meia noite" => CasualTimeType::Midnight,
145    "manhã" => CasualTimeType::Morning,
146    "manha" => CasualTimeType::Morning,
147    "tarde" => CasualTimeType::Afternoon,
148    "noite" => CasualTimeType::Night,
149};
150
151/// Relative modifiers
152pub static RELATIVE_MODIFIER_MAP: phf::Map<&'static str, RelativeModifier> = phf_map! {
153    "este" => RelativeModifier::This,
154    "esta" => RelativeModifier::This,
155    "isto" => RelativeModifier::This,
156    "próximo" => RelativeModifier::Next,
157    "proximo" => RelativeModifier::Next,
158    "próxima" => RelativeModifier::Next,
159    "proxima" => RelativeModifier::Next,
160    "seguinte" => RelativeModifier::Next,
161    "passado" => RelativeModifier::Last,
162    "passada" => RelativeModifier::Last,
163    "último" => RelativeModifier::Last,
164    "ultimo" => RelativeModifier::Last,
165    "última" => RelativeModifier::Last,
166    "ultima" => RelativeModifier::Last,
167    "anterior" => RelativeModifier::Last,
168};
169
170// ============================================================================
171// Lookup functions
172// ============================================================================
173
174#[inline]
175pub fn get_weekday(s: &str) -> Option<Weekday> {
176    WEEKDAY_MAP.get(s).copied()
177}
178
179#[inline]
180pub fn get_month(s: &str) -> Option<u32> {
181    MONTH_MAP.get(s).copied()
182}
183
184#[inline]
185pub fn get_integer_word(s: &str) -> Option<f64> {
186    INTEGER_WORD_MAP.get(s).copied()
187}
188
189#[inline]
190pub fn get_time_unit(s: &str) -> Option<TimeUnit> {
191    TIME_UNIT_MAP.get(s).copied()
192}
193
194#[inline]
195pub fn get_casual_date(s: &str) -> Option<CasualDateType> {
196    CASUAL_DATE_MAP.get(s).copied()
197}
198
199#[inline]
200pub fn get_casual_time(s: &str) -> Option<CasualTimeType> {
201    CASUAL_TIME_MAP.get(s).copied()
202}
203
204#[inline]
205pub fn get_relative_modifier(s: &str) -> Option<RelativeModifier> {
206    RELATIVE_MODIFIER_MAP.get(s).copied()
207}
208
209/// Parse a number pattern
210pub fn parse_number_pattern(text: &str) -> f64 {
211    let lower = text.to_lowercase();
212
213    if let Some(val) = get_integer_word(&lower) {
214        return val;
215    }
216
217    match lower.as_str() {
218        s if s.contains("alguns") || s.contains("algumas") => return 3.0,
219        s if s.contains("meia") || s.contains("meio") => return 0.5,
220        s if s.contains("vários") || s.contains("varios") => return 7.0,
221        _ => {}
222    }
223
224    text.parse::<f64>().unwrap_or(0.0)
225}