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