//! Days of the week.
use core::fmt::{self, Display};
use Weekday::*;
/// 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",
})
}
}