Coverage Report

Created: 2026-06-30 07:07

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/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
}