1use lazy_static::lazy_static;
2use std::collections::HashMap;
3
4use crate::weather::Source;
5
6#[derive(Debug, PartialEq)]
7pub enum TimeOfDay {
8 Night,
9 Day,
10}
11
12impl From<u8> for TimeOfDay {
13 fn from(is_day: u8) -> Self {
14 match is_day {
15 1 => TimeOfDay::Day,
16 _ => TimeOfDay::Night,
17 }
18 }
19}
20
21impl TimeOfDay {
22 #[must_use]
23 pub fn icon(&self, provider: &crate::weather::Source, code: i32) -> String {
24 let icons: &HashMap<i32, &'static str> = match provider {
25 Source::WeatherAPI => match self {
26 TimeOfDay::Day => &WEATHERAPI_DAY_ICONS,
27 TimeOfDay::Night => &WEATHERAPI_NIGHT_ICONS,
28 },
29 Source::OpenMeteo => match self {
30 TimeOfDay::Day => &OPEN_METEO_DAY_ICONS,
31 TimeOfDay::Night => &OPEN_METEO_NIGHT_ICONS,
32 },
33 };
34
35 (*icons.get(&code).unwrap_or(&"?")).to_string()
36 }
37}
38
39lazy_static! {
40 static ref WEATHERAPI_DAY_ICONS: HashMap<i32, &'static str> = {
41 let mut m = HashMap::new();
42 m.insert(1000, " "); m.insert(1003, " "); m.insert(1006, " "); m.insert(1009, " "); m.insert(1030, " "); m.insert(1063, " "); m.insert(1066, " "); m.insert(1069, " "); m.insert(1072, " "); m.insert(1087, " "); m.insert(1114, " "); m.insert(1117, " "); m.insert(1135, " "); m.insert(1147, " "); m.insert(1150, " "); m.insert(1153, " "); m.insert(1168, " "); m.insert(1171, " "); m.insert(1180, " "); m.insert(1183, " "); m.insert(1186, " "); m.insert(1189, " "); m.insert(1192, " "); m.insert(1195, " "); m.insert(1198, " "); m.insert(1201, " "); m.insert(1204, " "); m.insert(1207, " "); m.insert(1210, " "); m.insert(1213, " "); m.insert(1216, " "); m.insert(1219, " "); m.insert(1222, " "); m.insert(1225, " "); m.insert(1237, " "); m.insert(1240, " "); m.insert(1243, " "); m.insert(1246, " "); m.insert(1249, " "); m.insert(1252, " "); m.insert(1255, " "); m.insert(1258, " "); m.insert(1261, " "); m.insert(1264, " "); m.insert(1273, " "); m.insert(1276, " "); m.insert(1279, " "); m.insert(1282, " "); m
91 };
92
93 static ref WEATHERAPI_NIGHT_ICONS: HashMap<i32, &'static str> = {
94 let mut m = HashMap::new();
95 m.insert(1000, ""); m.insert(1003, ""); m.insert(1006, ""); m.insert(1009, ""); m.insert(1030, ""); m.insert(1063, ""); m.insert(1066, ""); m.insert(1069, ""); m.insert(1072, ""); m.insert(1087, ""); m.insert(1114, ""); m.insert(1117, ""); m.insert(1135, ""); m.insert(1147, ""); m.insert(1150, ""); m.insert(1153, ""); m.insert(1168, ""); m.insert(1171, ""); m.insert(1180, ""); m.insert(1183, ""); m.insert(1186, ""); m.insert(1189, ""); m.insert(1192, ""); m.insert(1195, ""); m.insert(1198, ""); m.insert(1201, ""); m.insert(1204, ""); m.insert(1207, ""); m.insert(1210, ""); m.insert(1213, ""); m.insert(1216, ""); m.insert(1219, ""); m.insert(1222, ""); m.insert(1225, ""); m.insert(1237, ""); m.insert(1240, ""); m.insert(1243, ""); m.insert(1246, ""); m.insert(1249, ""); m.insert(1252, ""); m.insert(1255, ""); m.insert(1258, ""); m.insert(1261, ""); m.insert(1264, ""); m.insert(1273, ""); m.insert(1276, ""); m.insert(1279, ""); m.insert(1282, ""); m
144 };
145
146 static ref OPEN_METEO_DAY_ICONS: HashMap<i32, &'static str> = {
147 let mut m = HashMap::new();
148 m.insert(0, " "); m.insert(1, " ");
150 m.insert(2, " ");
151 m.insert(3, " "); m.insert(45, " ");
153 m.insert(48, " "); m.insert(51, " ");
155 m.insert(53, " ");
156 m.insert(55, " "); m.insert(56, " ");
158 m.insert(57, " "); m.insert(61, " ");
160 m.insert(63, " ");
161 m.insert(65, " "); m.insert(66, " ");
163 m.insert(67, " "); m.insert(71, " ");
165 m.insert(73, " ");
166 m.insert(75, " "); m.insert(77, " "); m.insert(80, " ");
169 m.insert(81, " ");
170 m.insert(82, " "); m.insert(85, " ");
172 m.insert(86, " "); m.insert(95, " "); m.insert(96, " ");
175 m.insert(99, " "); m
177 };
178
179 static ref OPEN_METEO_NIGHT_ICONS: HashMap<i32, &'static str> = {
180 let mut m = HashMap::new();
181 m.insert(0, ""); m.insert(1, "");
183 m.insert(2, "");
184 m.insert(3, ""); m.insert(45, "");
186 m.insert(48, ""); m.insert(51, "");
188 m.insert(53, "");
189 m.insert(55, ""); m.insert(56, "");
191 m.insert(57, ""); m.insert(61, "");
193 m.insert(63, "");
194 m.insert(65, ""); m.insert(66, "");
196 m.insert(67, ""); m.insert(71, "");
198 m.insert(73, "");
199 m.insert(75, ""); m.insert(77, ""); m.insert(80, "");
202 m.insert(81, "");
203 m.insert(82, ""); m.insert(85, "");
205 m.insert(86, ""); m.insert(95, ""); m.insert(96, "");
208 m.insert(99, ""); m
210 };
211}
212
213#[cfg(test)]
214mod tests {
215 use super::*;
216
217 #[test]
218 fn it_converts_1_to_day() {
219 assert_eq!(TimeOfDay::from(1), TimeOfDay::Day);
220 }
221
222 #[test]
223 fn it_converts_0_to_night() {
224 assert_eq!(TimeOfDay::from(0), TimeOfDay::Night);
225 }
226
227 #[test]
228 fn it_converts_any_other_value_to_night() {
229 assert_eq!(TimeOfDay::from(42), TimeOfDay::Night);
230 }
231
232 #[test]
233 fn valid_code_for_day() {
234 let icon =
235 TimeOfDay::Day.icon(&crate::weather::Source::WeatherAPI, 1006);
236
237 assert_eq!(icon, " ".to_string());
238 }
239
240 #[test]
241 fn valid_code_for_night() {
242 let icon =
243 TimeOfDay::Night.icon(&crate::weather::Source::OpenMeteo, 71);
244
245 assert_eq!(icon, "".to_string());
246 }
247
248 #[test]
249 fn invalid_code_for() {
250 let icon =
251 TimeOfDay::Night.icon(&crate::weather::Source::WeatherAPI, 9999);
252
253 assert_eq!(icon, "?".to_string());
254 }
255}