Documentation
use chrono::{
    DateTime, Datelike as _, NaiveDate, NaiveDateTime, TimeZone, Weekday as ChronoWeekday,
};

use crate::Weekday;

pub static CHRONO_WEEKDAYS: &[ChronoWeekday] = &[
    ChronoWeekday::Mon,
    ChronoWeekday::Tue,
    ChronoWeekday::Wed,
    ChronoWeekday::Thu,
    ChronoWeekday::Fri,
    ChronoWeekday::Sat,
    ChronoWeekday::Sun,
];

impl From<ChronoWeekday> for Weekday {
    fn from(w: ChronoWeekday) -> Self {
        match w {
            ChronoWeekday::Mon => Self::Mon,
            ChronoWeekday::Tue => Self::Tue,
            ChronoWeekday::Wed => Self::Wed,
            ChronoWeekday::Thu => Self::Thu,
            ChronoWeekday::Fri => Self::Fri,
            ChronoWeekday::Sat => Self::Sat,
            ChronoWeekday::Sun => Self::Sun,
        }
    }
}
impl From<NaiveDate> for Weekday {
    fn from(d: NaiveDate) -> Self {
        Self::from(d.weekday())
    }
}
impl From<NaiveDateTime> for Weekday {
    fn from(dt: NaiveDateTime) -> Self {
        Self::from(dt.weekday())
    }
}
impl<Tz: TimeZone> From<DateTime<Tz>> for Weekday {
    fn from(dt: DateTime<Tz>) -> Self {
        Self::from(dt.weekday())
    }
}

impl From<Weekday> for ChronoWeekday {
    fn from(w: Weekday) -> Self {
        match w {
            Weekday::Mon => Self::Mon,
            Weekday::Tue => Self::Tue,
            Weekday::Wed => Self::Wed,
            Weekday::Thu => Self::Thu,
            Weekday::Fri => Self::Fri,
            Weekday::Sat => Self::Sat,
            Weekday::Sun => Self::Sun,
        }
    }
}

#[cfg(test)]
mod tests {
    use super::*;

    use chrono::Utc;

    #[test]
    fn simple() {
        assert_eq!(
            Weekday::from("2021-08-01".parse::<NaiveDate>().unwrap()),
            Weekday::Sun
        );
        assert_eq!(
            Weekday::from("2021-08-01T00:00:00".parse::<NaiveDateTime>().unwrap()),
            Weekday::Sun
        );
        assert_eq!(
            Weekday::from(
                "2021-08-01T00:00:00Z"
                    .parse::<DateTime<Utc>>()
                    .unwrap()
                    .date_naive()
            ),
            Weekday::Sun
        );
        assert_eq!(
            Weekday::from("2021-08-01T00:00:00Z".parse::<DateTime<Utc>>().unwrap()),
            Weekday::Sun
        );
    }
}