1 //! The `Month` enum and its associated `impl`s. 2 3 use core::convert::TryFrom; 4 use core::fmt; 5 use core::num::NonZeroU8; 6 7 use self::Month::*; 8 use crate::error; 9 10 /// Months of the year. 11 #[allow(clippy::missing_docs_in_private_items)] // variants 12 #[repr(u8)] 13 #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] 14 pub enum Month { 15 January = 1, 16 February = 2, 17 March = 3, 18 April = 4, 19 May = 5, 20 June = 6, 21 July = 7, 22 August = 8, 23 September = 9, 24 October = 10, 25 November = 11, 26 December = 12, 27 } 28 29 impl Month { 30 /// Create a `Month` from its numerical value. from_number(n: NonZeroU8) -> Result<Self, error::ComponentRange>31 pub(crate) const fn from_number(n: NonZeroU8) -> Result<Self, error::ComponentRange> { 32 match n.get() { 33 1 => Ok(January), 34 2 => Ok(February), 35 3 => Ok(March), 36 4 => Ok(April), 37 5 => Ok(May), 38 6 => Ok(June), 39 7 => Ok(July), 40 8 => Ok(August), 41 9 => Ok(September), 42 10 => Ok(October), 43 11 => Ok(November), 44 12 => Ok(December), 45 n => Err(error::ComponentRange { 46 name: "month", 47 minimum: 1, 48 maximum: 12, 49 value: n as _, 50 conditional_range: false, 51 }), 52 } 53 } 54 55 /// Get the previous month. 56 /// 57 /// ```rust 58 /// # use time::Month; 59 /// assert_eq!(Month::January.previous(), Month::December); 60 /// ``` previous(self) -> Self61 pub const fn previous(self) -> Self { 62 match self { 63 January => December, 64 February => January, 65 March => February, 66 April => March, 67 May => April, 68 June => May, 69 July => June, 70 August => July, 71 September => August, 72 October => September, 73 November => October, 74 December => November, 75 } 76 } 77 78 /// Get the next month. 79 /// 80 /// ```rust 81 /// # use time::Month; 82 /// assert_eq!(Month::January.next(), Month::February); 83 /// ``` next(self) -> Self84 pub const fn next(self) -> Self { 85 match self { 86 January => February, 87 February => March, 88 March => April, 89 April => May, 90 May => June, 91 June => July, 92 July => August, 93 August => September, 94 September => October, 95 October => November, 96 November => December, 97 December => January, 98 } 99 } 100 } 101 102 impl fmt::Display for Month { fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result103 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { 104 f.write_str(match self { 105 January => "January", 106 February => "February", 107 March => "March", 108 April => "April", 109 May => "May", 110 June => "June", 111 July => "July", 112 August => "August", 113 September => "September", 114 October => "October", 115 November => "November", 116 December => "December", 117 }) 118 } 119 } 120 121 impl From<Month> for u8 { from(month: Month) -> Self122 fn from(month: Month) -> Self { 123 month as _ 124 } 125 } 126 127 impl TryFrom<u8> for Month { 128 type Error = error::ComponentRange; 129 try_from(value: u8) -> Result<Self, Self::Error>130 fn try_from(value: u8) -> Result<Self, Self::Error> { 131 match NonZeroU8::new(value) { 132 Some(value) => Self::from_number(value), 133 None => Err(error::ComponentRange { 134 name: "month", 135 minimum: 1, 136 maximum: 12, 137 value: 0, 138 conditional_range: false, 139 }), 140 } 141 } 142 } 143