#[allow(unused_imports)]
use chrono::{Datelike, Local, Weekday};
use std::collections::HashSet;
use super::args::Forecast;
pub fn get_indices(forecast: &HashSet<Forecast>) -> Vec<usize> {
let mut forecast_indices: Vec<usize> = vec![];
#[cfg(not(test))]
let curr_day_ref = Local::now().weekday().number_from_monday();
#[cfg(test)]
let curr_day_ref = Weekday::Mon.number_from_monday();
for val in forecast {
match val {
Forecast::day => forecast_indices.push(0),
Forecast::week => forecast_indices.push(7),
Forecast::mo => forecast_indices.push(get_day_index(curr_day_ref, Weekday::Mon)),
Forecast::tu => forecast_indices.push(get_day_index(curr_day_ref, Weekday::Tue)),
Forecast::we => forecast_indices.push(get_day_index(curr_day_ref, Weekday::Wed)),
Forecast::th => forecast_indices.push(get_day_index(curr_day_ref, Weekday::Thu)),
Forecast::fr => forecast_indices.push(get_day_index(curr_day_ref, Weekday::Fri)),
Forecast::sa => forecast_indices.push(get_day_index(curr_day_ref, Weekday::Sat)),
Forecast::su => forecast_indices.push(get_day_index(curr_day_ref, Weekday::Sun)),
_ => (),
}
}
forecast_indices.sort();
forecast_indices
}
fn get_day_index(curr_day_ref: u32, forecast_day: Weekday) -> usize {
(((forecast_day.number_from_monday() as i8 - curr_day_ref as i8) % 7 + 7) % 7)
.try_into()
.unwrap()
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn index_form_day() {
assert!(get_day_index(Weekday::Mon.number_from_monday(), Weekday::Tue) == 1);
assert!(get_day_index(Weekday::Mon.number_from_monday(), Weekday::Wed) == 2);
assert!(get_day_index(Weekday::Mon.number_from_monday(), Weekday::Thu) == 3);
assert!(get_day_index(Weekday::Mon.number_from_monday(), Weekday::Fri) == 4);
assert!(get_day_index(Weekday::Mon.number_from_monday(), Weekday::Sat) == 5);
assert!(get_day_index(Weekday::Mon.number_from_monday(), Weekday::Sun) == 6);
assert!(get_day_index(Weekday::Sat.number_from_monday(), Weekday::Sun) == 1);
assert!(get_day_index(Weekday::Sat.number_from_monday(), Weekday::Mon) == 2);
assert!(get_day_index(Weekday::Sat.number_from_monday(), Weekday::Tue) == 3);
assert!(get_day_index(Weekday::Sat.number_from_monday(), Weekday::Wed) == 4);
assert!(get_day_index(Weekday::Sat.number_from_monday(), Weekday::Thu) == 5);
assert!(get_day_index(Weekday::Sat.number_from_monday(), Weekday::Fri) == 6);
}
#[test]
fn forecast_indices() {
assert!(get_indices(&HashSet::from([Forecast::mo])) == get_indices(&HashSet::from([Forecast::day])));
assert!(get_indices(&HashSet::from([Forecast::week])) == [7]);
assert!(get_indices(&HashSet::from([Forecast::tu, Forecast::we, Forecast::sa])) == [1, 2, 5]);
assert!(get_indices(&HashSet::from([Forecast::day, Forecast::week])) == [0, 7]);
}
}