cron_lite/
error.rs

1use std::{error::Error, fmt::Display};
2
3/// Crate specific Error implementation.
4#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
5pub enum CronError {
6    /// Invalid cron schedule.
7    InvalidCronSchedule(String),
8    /// Invalid day of month/week values.
9    InvalidDaysPattern(String),
10    /// Error parsing cron pattern.
11    InvalidCronPattern(String, String),
12    /// Invalid digital value.
13    InvalidDigitalValue(String, String),
14    /// Invalid mnemonic value.
15    InvalidMnemonicValue(String, String),
16    /// Invalid day of the week.
17    InvalidDayOfWeekValue(String, String),
18    /// Invalid range pattern.
19    InvalidRangeValue(String, String),
20    /// Invalid repeating pattern.
21    InvalidRepeatingPattern(String, String),
22    /// Invalid TimeZone
23    InvalidTimeZone(String),
24}
25
26impl Error for CronError {}
27
28impl Display for CronError {
29    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
30        match self {
31            CronError::InvalidCronSchedule(schedule) => write!(f, "invalid cron schedule: {schedule}"),
32            CronError::InvalidDaysPattern(pattern) => {
33                write!(f, "invalid patterns of days of month or/and week: {pattern}")
34            }
35            CronError::InvalidCronPattern(pattern, type_) => write!(f, "{type_}: invalid cron pattern: {pattern}"),
36            CronError::InvalidDigitalValue(value, type_) => write!(f, "{type_}: invalid digital value: {value}"),
37            CronError::InvalidMnemonicValue(value, type_) => write!(f, "{type_}: invalid mnemonic value: {value}"),
38            CronError::InvalidDayOfWeekValue(value, type_) => {
39                write!(f, "{type_}: invalid day of week value: {value}")
40            }
41            CronError::InvalidRangeValue(value, type_) => write!(f, "{type_}: invalid range pattern: {value}"),
42            CronError::InvalidRepeatingPattern(pattern, type_) => {
43                write!(f, "{type_}: invalid repeating pattern: {pattern}")
44            }
45            CronError::InvalidTimeZone(tz) => write!(f, "invalid time zone: {tz}"),
46        }
47    }
48}
49
50#[cfg(test)]
51mod tests {
52    use super::*;
53
54    #[test]
55    fn test_invalid_cron_schedule() {
56        let error = CronError::InvalidCronSchedule("* * *".to_string());
57        assert_eq!(error.to_string(), "invalid cron schedule: * * *");
58    }
59
60    #[test]
61    fn test_invalid_days_pattern() {
62        let error = CronError::InvalidDaysPattern("31W".to_string());
63        assert_eq!(error.to_string(), "invalid patterns of days of month or/and week: 31W");
64    }
65
66    #[test]
67    fn test_invalid_cron_pattern() {
68        let error = CronError::InvalidCronPattern("abc".to_string(), "minutes".to_string());
69        assert_eq!(error.to_string(), "minutes: invalid cron pattern: abc");
70    }
71
72    #[test]
73    fn test_invalid_digital_value() {
74        let error = CronError::InvalidDigitalValue("99".to_string(), "minutes".to_string());
75        assert_eq!(error.to_string(), "minutes: invalid digital value: 99");
76    }
77
78    #[test]
79    fn test_invalid_mnemonic_value() {
80        let error = CronError::InvalidMnemonicValue("FOO".to_string(), "months".to_string());
81        assert_eq!(error.to_string(), "months: invalid mnemonic value: FOO");
82    }
83
84    #[test]
85    fn test_invalid_day_of_week() {
86        let error = CronError::InvalidDayOfWeekValue("8".to_string(), "days of week".to_string());
87        assert_eq!(error.to_string(), "days of week: invalid day of week value: 8");
88    }
89
90    #[test]
91    fn test_invalid_range() {
92        let error = CronError::InvalidRangeValue("5-2".to_string(), "hours".to_string());
93        assert_eq!(error.to_string(), "hours: invalid range pattern: 5-2");
94    }
95
96    #[test]
97    fn test_invalid_repeating() {
98        let error = CronError::InvalidRepeatingPattern("*/0".to_string(), "minutes".to_string());
99        assert_eq!(error.to_string(), "minutes: invalid repeating pattern: */0");
100    }
101
102    #[test]
103    fn test_invalid_tz() {
104        let error = CronError::InvalidTimeZone("qqq".to_string());
105        assert_eq!(error.to_string(), "invalid time zone: qqq");
106    }
107}