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