1use std::{error::Error, fmt::Display};
2
3#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
5pub enum CronError {
6 InvalidCronSchedule(String),
8 InvalidDaysPattern(String),
10 InvalidCronPattern(String, String),
12 InvalidDigitalValue(String, String),
14 InvalidMnemonicValue(String, String),
16 InvalidDayOfWeekValue(String, String),
18 InvalidRangeValue(String, String),
20 InvalidRepeatingPattern(String, String),
22 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}