//! The `Month` enum and its associated `impl`s. use core::fmt; use core::num::NonZeroU8; use core::str::FromStr; use self::Month::*; use crate::error; /// Months of the year. #[allow(clippy::missing_docs_in_private_items)] // variants #[repr(u8)] #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] pub enum Month { January = 1, February = 2, March = 3, April = 4, May = 5, June = 6, July = 7, August = 8, September = 9, October = 10, November = 11, December = 12, } impl Month { /// Create a `Month` from its numerical value. pub(crate) const fn from_number(n: NonZeroU8) -> Result { match n.get() { 1 => Ok(January), 2 => Ok(February), 3 => Ok(March), 4 => Ok(April), 5 => Ok(May), 6 => Ok(June), 7 => Ok(July), 8 => Ok(August), 9 => Ok(September), 10 => Ok(October), 11 => Ok(November), 12 => Ok(December), n => Err(error::ComponentRange { name: "month", minimum: 1, maximum: 12, value: n as _, conditional_range: false, }), } } /// Get the previous month. /// /// ```rust /// # use time::Month; /// assert_eq!(Month::January.previous(), Month::December); /// ``` pub const fn previous(self) -> Self { match self { January => December, February => January, March => February, April => March, May => April, June => May, July => June, August => July, September => August, October => September, November => October, December => November, } } /// Get the next month. /// /// ```rust /// # use time::Month; /// assert_eq!(Month::January.next(), Month::February); /// ``` pub const fn next(self) -> Self { match self { January => February, February => March, March => April, April => May, May => June, June => July, July => August, August => September, September => October, October => November, November => December, December => January, } } } impl fmt::Display for Month { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { f.write_str(match self { January => "January", February => "February", March => "March", April => "April", May => "May", June => "June", July => "July", August => "August", September => "September", October => "October", November => "November", December => "December", }) } } impl FromStr for Month { type Err = error::InvalidVariant; fn from_str(s: &str) -> Result { match s { "January" => Ok(January), "February" => Ok(February), "March" => Ok(March), "April" => Ok(April), "May" => Ok(May), "June" => Ok(June), "July" => Ok(July), "August" => Ok(August), "September" => Ok(September), "October" => Ok(October), "November" => Ok(November), "December" => Ok(December), _ => Err(error::InvalidVariant), } } } impl From for u8 { fn from(month: Month) -> Self { month as _ } } impl TryFrom for Month { type Error = error::ComponentRange; fn try_from(value: u8) -> Result { match NonZeroU8::new(value) { Some(value) => Self::from_number(value), None => Err(error::ComponentRange { name: "month", minimum: 1, maximum: 12, value: 0, conditional_range: false, }), } } }