1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148
//! Days of the week.
use core::fmt::{self, Display};
use core::str::FromStr;
use Weekday::*;
use crate::error;
/// Days of the week.
///
/// As order is dependent on context (Sunday could be either two days after or five days before
/// Friday), this type does not implement `PartialOrd` or `Ord`.
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum Weekday {
#[allow(clippy::missing_docs_in_private_items)]
Monday,
#[allow(clippy::missing_docs_in_private_items)]
Tuesday,
#[allow(clippy::missing_docs_in_private_items)]
Wednesday,
#[allow(clippy::missing_docs_in_private_items)]
Thursday,
#[allow(clippy::missing_docs_in_private_items)]
Friday,
#[allow(clippy::missing_docs_in_private_items)]
Saturday,
#[allow(clippy::missing_docs_in_private_items)]
Sunday,
}
impl Weekday {
/// Get the previous weekday.
///
/// ```rust
/// # use time::Weekday;
/// assert_eq!(Weekday::Tuesday.previous(), Weekday::Monday);
/// ```
pub const fn previous(self) -> Self {
match self {
Monday => Sunday,
Tuesday => Monday,
Wednesday => Tuesday,
Thursday => Wednesday,
Friday => Thursday,
Saturday => Friday,
Sunday => Saturday,
}
}
/// Get the next weekday.
///
/// ```rust
/// # use time::Weekday;
/// assert_eq!(Weekday::Monday.next(), Weekday::Tuesday);
/// ```
pub const fn next(self) -> Self {
match self {
Monday => Tuesday,
Tuesday => Wednesday,
Wednesday => Thursday,
Thursday => Friday,
Friday => Saturday,
Saturday => Sunday,
Sunday => Monday,
}
}
/// Get the one-indexed number of days from Monday.
///
/// ```rust
/// # use time::Weekday;
/// assert_eq!(Weekday::Monday.number_from_monday(), 1);
/// ```
#[doc(alias = "iso_weekday_number")]
pub const fn number_from_monday(self) -> u8 {
self.number_days_from_monday() + 1
}
/// Get the one-indexed number of days from Sunday.
///
/// ```rust
/// # use time::Weekday;
/// assert_eq!(Weekday::Monday.number_from_sunday(), 2);
/// ```
pub const fn number_from_sunday(self) -> u8 {
self.number_days_from_sunday() + 1
}
/// Get the zero-indexed number of days from Monday.
///
/// ```rust
/// # use time::Weekday;
/// assert_eq!(Weekday::Monday.number_days_from_monday(), 0);
/// ```
pub const fn number_days_from_monday(self) -> u8 {
self as _
}
/// Get the zero-indexed number of days from Sunday.
///
/// ```rust
/// # use time::Weekday;
/// assert_eq!(Weekday::Monday.number_days_from_sunday(), 1);
/// ```
pub const fn number_days_from_sunday(self) -> u8 {
match self {
Monday => 1,
Tuesday => 2,
Wednesday => 3,
Thursday => 4,
Friday => 5,
Saturday => 6,
Sunday => 0,
}
}
}
impl Display for Weekday {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.write_str(match self {
Monday => "Monday",
Tuesday => "Tuesday",
Wednesday => "Wednesday",
Thursday => "Thursday",
Friday => "Friday",
Saturday => "Saturday",
Sunday => "Sunday",
})
}
}
impl FromStr for Weekday {
type Err = error::InvalidVariant;
fn from_str(s: &str) -> Result<Self, Self::Err> {
match s {
"Monday" => Ok(Monday),
"Tuesday" => Ok(Tuesday),
"Wednesday" => Ok(Wednesday),
"Thursday" => Ok(Thursday),
"Friday" => Ok(Friday),
"Saturday" => Ok(Saturday),
"Sunday" => Ok(Sunday),
_ => Err(error::InvalidVariant),
}
}
}