efficacy/cli/
dates.rs

1use super::errors::CliError;
2use chrono::{DateTime, Datelike, Duration, Local, TimeZone, Utc, Weekday};
3
4pub const DATE_FMT: &str = "%F %T";
5
6fn calculate_day_difference(weekday: Weekday) -> i64 {
7    let current_day = Local::now().weekday().number_from_monday() as i64;
8    let due_day = weekday.number_from_monday() as i64;
9    (due_day - current_day + 7) % 7
10}
11
12pub fn weekday_to_due_date(weekday: Weekday) -> DateTime<Utc> {
13    Local::today()
14        .checked_add_signed(Duration::days(calculate_day_difference(weekday)))
15        .unwrap()
16        .and_hms(8, 0, 0)
17        .with_timezone(&Utc)
18}
19
20pub fn string_to_weekday(string: &str) -> Result<Weekday, CliError> {
21    match &string.to_lowercase()[..] {
22        "mon" | "monday" => Ok(Weekday::Mon),
23        "tue" | "tues" | "tu" | "tuesday" => Ok(Weekday::Tue),
24        "wed" | "wednesday" => Ok(Weekday::Wed),
25        "thu" | "thurs" | "thur" | "thursday" => Ok(Weekday::Thu),
26        "fri" | "friday" => Ok(Weekday::Fri),
27        "sat" | "saturday" | "sa" => Ok(Weekday::Sat),
28        "sun" | "sunday" | "su" => Ok(Weekday::Sun),
29        _ => Err(CliError::ParsingError),
30    }
31}
32
33pub fn string_to_due_date(string: &str) -> Result<DateTime<Utc>, CliError> {
34    Ok(match Local.datetime_from_str(string, DATE_FMT) {
35        Ok(d) => d.with_timezone(&Utc),
36        Err(_) => return Err(CliError::ParsingError),
37    })
38}