1use crate::error::*;
2use crate::ordinal::{Ordinal, OrdinalSet, Pattern, OrdinalList};
3use crate::time_unit::TimeUnitField;
4use std::borrow::Cow;
5use once_cell::sync::Lazy;
6
7static ALL: Lazy<OrdinalSet> = Lazy::new(|| { Months::supported_ordinals() });
8
9#[derive(Clone, Debug, Eq)]
10pub struct Months{
11 ordinals: Option<OrdinalSet>,
12 pattern: Pattern,
13 ordinal_list: OrdinalList,
14}
15
16impl TimeUnitField for Months {
17 fn from_optional_ordinal_set(ordinal_set: Option<OrdinalSet>, pattern: Pattern, ordinal_list: OrdinalList) -> Self {
18 Months{
19 ordinals: ordinal_set,
20 pattern,
21 ordinal_list
22 }
23 }
24 fn name() -> Cow<'static, str> {
25 Cow::from("Months")
26 }
27 fn inclusive_min() -> Ordinal {
28 1
29 }
30 fn inclusive_max() -> Ordinal {
31 12
32 }
33 fn ordinal_from_name(name: &str) -> Result<Ordinal, Error> {
34 let ordinal = match name.to_lowercase().as_ref() {
36 "jan" | "january" => 1,
37 "feb" | "february" => 2,
38 "mar" | "march" => 3,
39 "apr" | "april" => 4,
40 "may" => 5,
41 "jun" | "june" => 6,
42 "jul" | "july" => 7,
43 "aug" | "august" => 8,
44 "sep" | "september" => 9,
45 "oct" | "october" => 10,
46 "nov" | "november" => 11,
47 "dec" | "december" => 12,
48 _ => {
49 return Err(
50 ErrorKind::Expression(format!("'{}' is not a valid month name.", name)).into(),
51 )
52 }
53 };
54 Ok(ordinal)
55 }
56 fn ordinals(&self) -> &OrdinalSet {
57 match &self.ordinals {
58 Some(ordinal_set) => ordinal_set,
59 None => &ALL
60 }
61 }
62 fn ordinal_list(&self) -> &OrdinalList {
63 &self.ordinal_list
64 }
65 fn matching_pattern(&self) -> &str {
66 &self.pattern
67 }
68}
69
70impl PartialEq for Months {
71 fn eq(&self, other: &Months) -> bool {
72 self.ordinals() == other.ordinals()
73 }
74}