/rust/registry/src/index.crates.io-6f17d22bba15001f/time-0.3.41/src/weekday.rs
Line | Count | Source (jump to first uncovered line) |
1 | | //! Days of the week. |
2 | | |
3 | | use core::fmt; |
4 | | use core::str::FromStr; |
5 | | |
6 | | use powerfmt::smart_display::{FormatterOptions, Metadata, SmartDisplay}; |
7 | | |
8 | | use self::Weekday::*; |
9 | | use crate::error; |
10 | | |
11 | | /// Days of the week. |
12 | | /// |
13 | | /// As order is dependent on context (Sunday could be either two days after or five days before |
14 | | /// Friday), this type does not implement `PartialOrd` or `Ord`. |
15 | | #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] |
16 | | pub enum Weekday { |
17 | | #[allow(missing_docs)] |
18 | | Monday, |
19 | | #[allow(missing_docs)] |
20 | | Tuesday, |
21 | | #[allow(missing_docs)] |
22 | | Wednesday, |
23 | | #[allow(missing_docs)] |
24 | | Thursday, |
25 | | #[allow(missing_docs)] |
26 | | Friday, |
27 | | #[allow(missing_docs)] |
28 | | Saturday, |
29 | | #[allow(missing_docs)] |
30 | | Sunday, |
31 | | } |
32 | | |
33 | | impl Weekday { |
34 | | /// Get the previous weekday. |
35 | | /// |
36 | | /// ```rust |
37 | | /// # use time::Weekday; |
38 | | /// assert_eq!(Weekday::Tuesday.previous(), Weekday::Monday); |
39 | | /// ``` |
40 | 0 | pub const fn previous(self) -> Self { |
41 | 0 | match self { |
42 | 0 | Monday => Sunday, |
43 | 0 | Tuesday => Monday, |
44 | 0 | Wednesday => Tuesday, |
45 | 0 | Thursday => Wednesday, |
46 | 0 | Friday => Thursday, |
47 | 0 | Saturday => Friday, |
48 | 0 | Sunday => Saturday, |
49 | | } |
50 | 0 | } |
51 | | |
52 | | /// Get the next weekday. |
53 | | /// |
54 | | /// ```rust |
55 | | /// # use time::Weekday; |
56 | | /// assert_eq!(Weekday::Monday.next(), Weekday::Tuesday); |
57 | | /// ``` |
58 | 0 | pub const fn next(self) -> Self { |
59 | 0 | match self { |
60 | 0 | Monday => Tuesday, |
61 | 0 | Tuesday => Wednesday, |
62 | 0 | Wednesday => Thursday, |
63 | 0 | Thursday => Friday, |
64 | 0 | Friday => Saturday, |
65 | 0 | Saturday => Sunday, |
66 | 0 | Sunday => Monday, |
67 | | } |
68 | 0 | } |
69 | | |
70 | | /// Get n-th next day. |
71 | | /// |
72 | | /// ```rust |
73 | | /// # use time::Weekday; |
74 | | /// assert_eq!(Weekday::Monday.nth_next(1), Weekday::Tuesday); |
75 | | /// assert_eq!(Weekday::Sunday.nth_next(10), Weekday::Wednesday); |
76 | | /// ``` |
77 | 0 | pub const fn nth_next(self, n: u8) -> Self { |
78 | 0 | match (self.number_days_from_monday() + n % 7) % 7 { |
79 | 0 | 0 => Monday, |
80 | 0 | 1 => Tuesday, |
81 | 0 | 2 => Wednesday, |
82 | 0 | 3 => Thursday, |
83 | 0 | 4 => Friday, |
84 | 0 | 5 => Saturday, |
85 | 0 | val => { |
86 | 0 | debug_assert!(val == 6); |
87 | 0 | Sunday |
88 | | } |
89 | | } |
90 | 0 | } |
91 | | |
92 | | /// Get n-th previous day. |
93 | | /// |
94 | | /// ```rust |
95 | | /// # use time::Weekday; |
96 | | /// assert_eq!(Weekday::Monday.nth_prev(1), Weekday::Sunday); |
97 | | /// assert_eq!(Weekday::Sunday.nth_prev(10), Weekday::Thursday); |
98 | | /// ``` |
99 | 0 | pub const fn nth_prev(self, n: u8) -> Self { |
100 | 0 | match self.number_days_from_monday() as i8 - (n % 7) as i8 { |
101 | 0 | 1 | -6 => Tuesday, |
102 | 0 | 2 | -5 => Wednesday, |
103 | 0 | 3 | -4 => Thursday, |
104 | 0 | 4 | -3 => Friday, |
105 | 0 | 5 | -2 => Saturday, |
106 | 0 | 6 | -1 => Sunday, |
107 | 0 | val => { |
108 | 0 | debug_assert!(val == 0); |
109 | 0 | Monday |
110 | | } |
111 | | } |
112 | 0 | } |
113 | | |
114 | | /// Get the one-indexed number of days from Monday. |
115 | | /// |
116 | | /// ```rust |
117 | | /// # use time::Weekday; |
118 | | /// assert_eq!(Weekday::Monday.number_from_monday(), 1); |
119 | | /// ``` |
120 | | #[doc(alias = "iso_weekday_number")] |
121 | 0 | pub const fn number_from_monday(self) -> u8 { |
122 | 0 | self.number_days_from_monday() + 1 |
123 | 0 | } |
124 | | |
125 | | /// Get the one-indexed number of days from Sunday. |
126 | | /// |
127 | | /// ```rust |
128 | | /// # use time::Weekday; |
129 | | /// assert_eq!(Weekday::Monday.number_from_sunday(), 2); |
130 | | /// ``` |
131 | 0 | pub const fn number_from_sunday(self) -> u8 { |
132 | 0 | self.number_days_from_sunday() + 1 |
133 | 0 | } |
134 | | |
135 | | /// Get the zero-indexed number of days from Monday. |
136 | | /// |
137 | | /// ```rust |
138 | | /// # use time::Weekday; |
139 | | /// assert_eq!(Weekday::Monday.number_days_from_monday(), 0); |
140 | | /// ``` |
141 | 0 | pub const fn number_days_from_monday(self) -> u8 { |
142 | 0 | self as u8 |
143 | 0 | } |
144 | | |
145 | | /// Get the zero-indexed number of days from Sunday. |
146 | | /// |
147 | | /// ```rust |
148 | | /// # use time::Weekday; |
149 | | /// assert_eq!(Weekday::Monday.number_days_from_sunday(), 1); |
150 | | /// ``` |
151 | 0 | pub const fn number_days_from_sunday(self) -> u8 { |
152 | 0 | match self { |
153 | 0 | Monday => 1, |
154 | 0 | Tuesday => 2, |
155 | 0 | Wednesday => 3, |
156 | 0 | Thursday => 4, |
157 | 0 | Friday => 5, |
158 | 0 | Saturday => 6, |
159 | 0 | Sunday => 0, |
160 | | } |
161 | 0 | } |
162 | | } |
163 | | |
164 | | mod private { |
165 | | #[non_exhaustive] |
166 | | #[derive(Debug, Clone, Copy)] |
167 | | pub struct WeekdayMetadata; |
168 | | } |
169 | | use private::WeekdayMetadata; |
170 | | |
171 | | impl SmartDisplay for Weekday { |
172 | | type Metadata = WeekdayMetadata; |
173 | | |
174 | 0 | fn metadata(&self, _: FormatterOptions) -> Metadata<'_, Self> { |
175 | 0 | match self { |
176 | 0 | Monday => Metadata::new(6, self, WeekdayMetadata), |
177 | 0 | Tuesday => Metadata::new(7, self, WeekdayMetadata), |
178 | 0 | Wednesday => Metadata::new(9, self, WeekdayMetadata), |
179 | 0 | Thursday => Metadata::new(8, self, WeekdayMetadata), |
180 | 0 | Friday => Metadata::new(6, self, WeekdayMetadata), |
181 | 0 | Saturday => Metadata::new(8, self, WeekdayMetadata), |
182 | 0 | Sunday => Metadata::new(6, self, WeekdayMetadata), |
183 | | } |
184 | 0 | } |
185 | | |
186 | 0 | fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { |
187 | 0 | f.pad(match self { |
188 | 0 | Monday => "Monday", |
189 | 0 | Tuesday => "Tuesday", |
190 | 0 | Wednesday => "Wednesday", |
191 | 0 | Thursday => "Thursday", |
192 | 0 | Friday => "Friday", |
193 | 0 | Saturday => "Saturday", |
194 | 0 | Sunday => "Sunday", |
195 | | }) |
196 | 0 | } |
197 | | } |
198 | | |
199 | | impl fmt::Display for Weekday { |
200 | 0 | fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { |
201 | 0 | SmartDisplay::fmt(self, f) |
202 | 0 | } |
203 | | } |
204 | | |
205 | | impl FromStr for Weekday { |
206 | | type Err = error::InvalidVariant; |
207 | | |
208 | 0 | fn from_str(s: &str) -> Result<Self, Self::Err> { |
209 | 0 | match s { |
210 | 0 | "Monday" => Ok(Monday), |
211 | 0 | "Tuesday" => Ok(Tuesday), |
212 | 0 | "Wednesday" => Ok(Wednesday), |
213 | 0 | "Thursday" => Ok(Thursday), |
214 | 0 | "Friday" => Ok(Friday), |
215 | 0 | "Saturday" => Ok(Saturday), |
216 | 0 | "Sunday" => Ok(Sunday), |
217 | 0 | _ => Err(error::InvalidVariant), |
218 | | } |
219 | 0 | } |
220 | | } |