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}