#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[cfg_attr(
feature = "serde",
serde(try_from = "crate::serde::Weekday", into = "crate::serde::Weekday")
)]
#[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,
}
use Weekday::{Friday, Monday, Saturday, Sunday, Thursday, Tuesday, Wednesday};
impl Weekday {
#[inline(always)]
pub fn previous(self) -> Self {
match self {
Monday => Sunday,
Tuesday => Monday,
Wednesday => Tuesday,
Thursday => Wednesday,
Friday => Thursday,
Saturday => Friday,
Sunday => Saturday,
}
}
#[inline(always)]
pub fn next(self) -> Self {
match self {
Monday => Tuesday,
Tuesday => Wednesday,
Wednesday => Thursday,
Thursday => Friday,
Friday => Saturday,
Saturday => Sunday,
Sunday => Monday,
}
}
#[inline(always)]
pub const fn iso_weekday_number(self) -> u8 {
self.number_from_monday()
}
#[inline(always)]
pub const fn number_from_monday(self) -> u8 {
self.number_days_from_monday() + 1
}
#[inline(always)]
pub const fn number_from_sunday(self) -> u8 {
self.number_days_from_sunday() + 1
}
#[inline(always)]
pub const fn number_days_from_monday(self) -> u8 {
self as u8
}
#[inline(always)]
pub const fn number_days_from_sunday(self) -> u8 {
(self as u8 + 1) % 7
}
}
#[cfg(test)]
mod test {
use super::*;
#[test]
fn previous() {
assert_eq!(Sunday.previous(), Saturday);
assert_eq!(Monday.previous(), Sunday);
assert_eq!(Tuesday.previous(), Monday);
assert_eq!(Wednesday.previous(), Tuesday);
assert_eq!(Thursday.previous(), Wednesday);
assert_eq!(Friday.previous(), Thursday);
assert_eq!(Saturday.previous(), Friday);
}
#[test]
fn next() {
assert_eq!(Sunday.next(), Monday);
assert_eq!(Monday.next(), Tuesday);
assert_eq!(Tuesday.next(), Wednesday);
assert_eq!(Wednesday.next(), Thursday);
assert_eq!(Thursday.next(), Friday);
assert_eq!(Friday.next(), Saturday);
assert_eq!(Saturday.next(), Sunday);
}
#[test]
fn iso_weekday_number() {
assert_eq!(Monday.iso_weekday_number(), 1);
assert_eq!(Tuesday.iso_weekday_number(), 2);
assert_eq!(Wednesday.iso_weekday_number(), 3);
assert_eq!(Thursday.iso_weekday_number(), 4);
assert_eq!(Friday.iso_weekday_number(), 5);
assert_eq!(Saturday.iso_weekday_number(), 6);
assert_eq!(Sunday.iso_weekday_number(), 7);
}
#[test]
fn number_from_monday() {
assert_eq!(Monday.number_from_monday(), 1);
assert_eq!(Tuesday.number_from_monday(), 2);
assert_eq!(Wednesday.number_from_monday(), 3);
assert_eq!(Thursday.number_from_monday(), 4);
assert_eq!(Friday.number_from_monday(), 5);
assert_eq!(Saturday.number_from_monday(), 6);
assert_eq!(Sunday.number_from_monday(), 7);
}
#[test]
fn number_from_sunday() {
assert_eq!(Sunday.number_from_sunday(), 1);
assert_eq!(Monday.number_from_sunday(), 2);
assert_eq!(Tuesday.number_from_sunday(), 3);
assert_eq!(Wednesday.number_from_sunday(), 4);
assert_eq!(Thursday.number_from_sunday(), 5);
assert_eq!(Friday.number_from_sunday(), 6);
assert_eq!(Saturday.number_from_sunday(), 7);
}
#[test]
fn number_days_from_monday() {
assert_eq!(Monday.number_days_from_monday(), 0);
assert_eq!(Tuesday.number_days_from_monday(), 1);
assert_eq!(Wednesday.number_days_from_monday(), 2);
assert_eq!(Thursday.number_days_from_monday(), 3);
assert_eq!(Friday.number_days_from_monday(), 4);
assert_eq!(Saturday.number_days_from_monday(), 5);
assert_eq!(Sunday.number_days_from_monday(), 6);
}
#[test]
fn number_days_from_sunday() {
assert_eq!(Sunday.number_days_from_sunday(), 0);
assert_eq!(Monday.number_days_from_sunday(), 1);
assert_eq!(Tuesday.number_days_from_sunday(), 2);
assert_eq!(Wednesday.number_days_from_sunday(), 3);
assert_eq!(Thursday.number_days_from_sunday(), 4);
assert_eq!(Friday.number_days_from_sunday(), 5);
assert_eq!(Saturday.number_days_from_sunday(), 6);
}
}