1 use const_fn::const_fn;
2 use core::fmt::{self, Display};
3 #[cfg(feature = "serde")]
4 use standback::convert::TryInto;
5 use Weekday::*;
6 
7 /// Days of the week.
8 ///
9 /// As order is dependent on context (Sunday could be either
10 /// two days after or five days before Friday), this type does not implement
11 /// `PartialOrd` or `Ord`.
12 #[cfg_attr(feature = "serde", derive(serde::Serialize))]
13 #[cfg_attr(feature = "serde", serde(into = "crate::serde::Weekday"))]
14 #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
15 pub enum Weekday {
16     #[allow(clippy::missing_docs_in_private_items)]
17     Monday,
18     #[allow(clippy::missing_docs_in_private_items)]
19     Tuesday,
20     #[allow(clippy::missing_docs_in_private_items)]
21     Wednesday,
22     #[allow(clippy::missing_docs_in_private_items)]
23     Thursday,
24     #[allow(clippy::missing_docs_in_private_items)]
25     Friday,
26     #[allow(clippy::missing_docs_in_private_items)]
27     Saturday,
28     #[allow(clippy::missing_docs_in_private_items)]
29     Sunday,
30 }
31 
32 #[cfg(feature = "serde")]
33 impl<'a> serde::Deserialize<'a> for Weekday {
deserialize<D>(deserializer: D) -> Result<Self, D::Error> where D: serde::Deserializer<'a>,34     fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
35     where
36         D: serde::Deserializer<'a>,
37     {
38         crate::serde::Weekday::deserialize(deserializer)?
39             .try_into()
40             .map_err(serde::de::Error::custom)
41     }
42 }
43 
44 impl Weekday {
45     /// Get the previous weekday.
46     ///
47     /// ```rust
48     /// # use time::Weekday;
49     /// assert_eq!(Weekday::Tuesday.previous(), Weekday::Monday);
50     /// ```
51     ///
52     /// This function is `const fn` when using rustc >= 1.46.
53     #[const_fn("1.46")]
previous(self) -> Self54     pub const fn previous(self) -> Self {
55         match self {
56             Monday => Sunday,
57             Tuesday => Monday,
58             Wednesday => Tuesday,
59             Thursday => Wednesday,
60             Friday => Thursday,
61             Saturday => Friday,
62             Sunday => Saturday,
63         }
64     }
65 
66     /// Get the next weekday.
67     ///
68     /// ```rust
69     /// # use time::Weekday;
70     /// assert_eq!(Weekday::Monday.next(), Weekday::Tuesday);
71     /// ```
72     ///
73     /// This function is `const fn` when using rustc >= 1.46.
74     #[const_fn("1.46")]
next(self) -> Self75     pub const fn next(self) -> Self {
76         match self {
77             Monday => Tuesday,
78             Tuesday => Wednesday,
79             Wednesday => Thursday,
80             Thursday => Friday,
81             Friday => Saturday,
82             Saturday => Sunday,
83             Sunday => Monday,
84         }
85     }
86 
87     /// Get the ISO 8601 weekday number. Equivalent to
88     /// [`Weekday::number_from_monday`].
89     ///
90     /// ```rust
91     /// # use time::Weekday;
92     /// assert_eq!(Weekday::Monday.iso_weekday_number(), 1);
93     /// ```
iso_weekday_number(self) -> u894     pub const fn iso_weekday_number(self) -> u8 {
95         self.number_from_monday()
96     }
97 
98     /// Get the one-indexed number of days from Monday.
99     ///
100     /// ```rust
101     /// # use time::Weekday;
102     /// assert_eq!(Weekday::Monday.number_from_monday(), 1);
103     /// ```
number_from_monday(self) -> u8104     pub const fn number_from_monday(self) -> u8 {
105         self.number_days_from_monday() + 1
106     }
107 
108     /// Get the one-indexed number of days from Sunday.
109     ///
110     /// ```rust
111     /// # use time::Weekday;
112     /// assert_eq!(Weekday::Monday.number_from_sunday(), 2);
113     /// ```
number_from_sunday(self) -> u8114     pub const fn number_from_sunday(self) -> u8 {
115         self.number_days_from_sunday() + 1
116     }
117 
118     /// Get the zero-indexed number of days from Monday.
119     ///
120     /// ```rust
121     /// # use time::Weekday;
122     /// assert_eq!(Weekday::Monday.number_days_from_monday(), 0);
123     /// ```
number_days_from_monday(self) -> u8124     pub const fn number_days_from_monday(self) -> u8 {
125         self as u8
126     }
127 
128     /// Get the zero-indexed number of days from Sunday.
129     ///
130     /// ```rust
131     /// # use time::Weekday;
132     /// assert_eq!(Weekday::Monday.number_days_from_sunday(), 1);
133     /// ```
number_days_from_sunday(self) -> u8134     pub const fn number_days_from_sunday(self) -> u8 {
135         (self as u8 + 1) % 7
136     }
137 }
138 
139 impl Display for Weekday {
fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result140     fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
141         f.write_str(match self {
142             Monday => "Monday",
143             Tuesday => "Tuesday",
144             Wednesday => "Wednesday",
145             Thursday => "Thursday",
146             Friday => "Friday",
147             Saturday => "Saturday",
148             Sunday => "Sunday",
149         })
150     }
151 }
152