use {
core::{
fmt::{self, Debug, Display, Formatter},
ops::Deref,
str::FromStr,
},
crate::{Error, Result as CrateResult},
};
#[cfg(test)]
mod tests;
#[derive(Debug, Eq, PartialEq, Hash, Ord, PartialOrd, Clone, Copy)]
pub enum Weekday {
Monday,
Tuesday,
Wednesday,
Thursday,
Friday,
Saturday,
Sunday,
}
impl Weekday {
pub const fn next(&self) -> Option<Self> {
match self {
Weekday::Monday => Some(Weekday::Tuesday),
Weekday::Tuesday => Some(Weekday::Wednesday),
Weekday::Wednesday => Some(Weekday::Thursday),
Weekday::Thursday => Some(Weekday::Friday),
Weekday::Friday => Some(Weekday::Saturday),
Weekday::Saturday => Some(Weekday::Sunday),
Weekday::Sunday => None,
}
}
pub const fn wrapping_next(&self) -> Self {
match self {
Weekday::Monday => Weekday::Tuesday,
Weekday::Tuesday => Weekday::Wednesday,
Weekday::Wednesday => Weekday::Thursday,
Weekday::Thursday => Weekday::Friday,
Weekday::Friday => Weekday::Saturday,
Weekday::Saturday => Weekday::Sunday,
Weekday::Sunday => Weekday::Monday,
}
}
pub const fn last(&self) -> Option<Self> {
match self {
Weekday::Monday => None,
Weekday::Tuesday => Some(Weekday::Monday),
Weekday::Wednesday => Some(Weekday::Tuesday),
Weekday::Thursday => Some(Weekday::Wednesday),
Weekday::Friday => Some(Weekday::Thursday),
Weekday::Saturday => Some(Weekday::Friday),
Weekday::Sunday => Some(Weekday::Saturday),
}
}
pub const fn wrapping_last(&self) -> Self {
match self {
Weekday::Monday => Weekday::Sunday,
Weekday::Tuesday => Weekday::Monday,
Weekday::Wednesday => Weekday::Tuesday,
Weekday::Thursday => Weekday::Wednesday,
Weekday::Friday => Weekday::Thursday,
Weekday::Saturday => Weekday::Friday,
Weekday::Sunday => Weekday::Saturday,
}
}
pub (crate) fn try_from_unix(weekday: i64) -> CrateResult<Self> {
match weekday {
0 => Ok(Weekday::Sunday),
1 => Ok(Weekday::Monday),
2 => Ok(Weekday::Tuesday),
3 => Ok(Weekday::Wednesday),
4 => Ok(Weekday::Thursday),
5 => Ok(Weekday::Friday),
6 => Ok(Weekday::Saturday),
_ => Err(err!("Invalid Unix weekday: {weekday}", weekday=weekday)),
}
}
}
impl Deref for Weekday {
type Target = str;
fn deref(&self) -> &Self::Target {
match self {
Weekday::Monday => "Monday",
Weekday::Tuesday => "Tuesday",
Weekday::Wednesday => "Wednesday",
Weekday::Thursday => "Thursday",
Weekday::Friday => "Friday",
Weekday::Saturday => "Saturday",
Weekday::Sunday => "Sunday",
}
}
}
impl Display for Weekday {
fn fmt(&self, f: &mut Formatter) -> Result<(), fmt::Error> {
f.write_str(self)
}
}
impl FromStr for Weekday {
type Err = Error;
fn from_str(s: &str) -> Result<Self, Self::Err> {
if s.eq_ignore_ascii_case(&*Weekday::Monday) {
Ok(Weekday::Monday)
} else if s.eq_ignore_ascii_case(&*Weekday::Tuesday) {
Ok(Weekday::Tuesday)
} else if s.eq_ignore_ascii_case(&*Weekday::Wednesday) {
Ok(Weekday::Wednesday)
} else if s.eq_ignore_ascii_case(&*Weekday::Thursday) {
Ok(Weekday::Thursday)
} else if s.eq_ignore_ascii_case(&*Weekday::Friday) {
Ok(Weekday::Friday)
} else if s.eq_ignore_ascii_case(&*Weekday::Saturday) {
Ok(Weekday::Saturday)
} else if s.eq_ignore_ascii_case(&*Weekday::Sunday) {
Ok(Weekday::Sunday)
} else {
Err(err!("Unknown weekday: {:?}", s))
}
}
}