cron/time_unit/
months.rs

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        //TODO: Use phf crate
35        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}