weekday/
chrono.rs

1use chrono::{
2    DateTime, Datelike as _, NaiveDate, NaiveDateTime, TimeZone, Weekday as ChronoWeekday,
3};
4
5use crate::Weekday;
6
7pub static CHRONO_WEEKDAYS: &[ChronoWeekday] = &[
8    ChronoWeekday::Mon,
9    ChronoWeekday::Tue,
10    ChronoWeekday::Wed,
11    ChronoWeekday::Thu,
12    ChronoWeekday::Fri,
13    ChronoWeekday::Sat,
14    ChronoWeekday::Sun,
15];
16
17impl From<ChronoWeekday> for Weekday {
18    fn from(w: ChronoWeekday) -> Self {
19        match w {
20            ChronoWeekday::Mon => Self::Mon,
21            ChronoWeekday::Tue => Self::Tue,
22            ChronoWeekday::Wed => Self::Wed,
23            ChronoWeekday::Thu => Self::Thu,
24            ChronoWeekday::Fri => Self::Fri,
25            ChronoWeekday::Sat => Self::Sat,
26            ChronoWeekday::Sun => Self::Sun,
27        }
28    }
29}
30impl From<NaiveDate> for Weekday {
31    fn from(d: NaiveDate) -> Self {
32        Self::from(d.weekday())
33    }
34}
35impl From<NaiveDateTime> for Weekday {
36    fn from(dt: NaiveDateTime) -> Self {
37        Self::from(dt.weekday())
38    }
39}
40impl<Tz: TimeZone> From<DateTime<Tz>> for Weekday {
41    fn from(dt: DateTime<Tz>) -> Self {
42        Self::from(dt.weekday())
43    }
44}
45
46impl From<Weekday> for ChronoWeekday {
47    fn from(w: Weekday) -> Self {
48        match w {
49            Weekday::Mon => Self::Mon,
50            Weekday::Tue => Self::Tue,
51            Weekday::Wed => Self::Wed,
52            Weekday::Thu => Self::Thu,
53            Weekday::Fri => Self::Fri,
54            Weekday::Sat => Self::Sat,
55            Weekday::Sun => Self::Sun,
56        }
57    }
58}
59
60#[cfg(test)]
61mod tests {
62    use super::*;
63
64    use chrono::Utc;
65
66    #[test]
67    fn simple() {
68        assert_eq!(
69            Weekday::from("2021-08-01".parse::<NaiveDate>().unwrap()),
70            Weekday::Sun
71        );
72        assert_eq!(
73            Weekday::from("2021-08-01T00:00:00".parse::<NaiveDateTime>().unwrap()),
74            Weekday::Sun
75        );
76        assert_eq!(
77            Weekday::from(
78                "2021-08-01T00:00:00Z"
79                    .parse::<DateTime<Utc>>()
80                    .unwrap()
81                    .date_naive()
82            ),
83            Weekday::Sun
84        );
85        assert_eq!(
86            Weekday::from("2021-08-01T00:00:00Z".parse::<DateTime<Utc>>().unwrap()),
87            Weekday::Sun
88        );
89    }
90}