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