Coverage Report

Created: 2025-10-10 07:05

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