Coverage Report

Created: 2025-07-18 06:52

/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
}