1//! The `Month` enum and its associated `impl`s.
2
3use core::fmt;
4use core::num::NonZeroU8;
5use core::str::FromStr;
6
7use self::Month::*;
8use 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)]
14pub 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
29impl Month {
30 /// Create a `Month` from its numerical value.
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 /// ```
61 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 /// ```
84 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
102impl fmt::Display for Month {
103 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
104 f.write_str(data: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
121impl FromStr for Month {
122 type Err = error::InvalidVariant;
123
124 fn from_str(s: &str) -> Result<Self, Self::Err> {
125 match s {
126 "January" => Ok(January),
127 "February" => Ok(February),
128 "March" => Ok(March),
129 "April" => Ok(April),
130 "May" => Ok(May),
131 "June" => Ok(June),
132 "July" => Ok(July),
133 "August" => Ok(August),
134 "September" => Ok(September),
135 "October" => Ok(October),
136 "November" => Ok(November),
137 "December" => Ok(December),
138 _ => Err(error::InvalidVariant),
139 }
140 }
141}
142
143impl From<Month> for u8 {
144 fn from(month: Month) -> Self {
145 month as _
146 }
147}
148
149impl TryFrom<u8> for Month {
150 type Error = error::ComponentRange;
151
152 fn try_from(value: u8) -> Result<Self, Self::Error> {
153 match NonZeroU8::new(value) {
154 Some(value: NonZero) => Self::from_number(value),
155 None => Err(error::ComponentRange {
156 name: "month",
157 minimum: 1,
158 maximum: 12,
159 value: 0,
160 conditional_range: false,
161 }),
162 }
163 }
164}
165