Skip to main content

cron_expr/
error.rs

1use std::fmt;
2use std::fmt::Formatter;
3
4use crate::time_unit::TimeUnitKind;
5
6#[derive(Debug)]
7pub enum TimeUnitErrorKind<'a> {
8    InvalidValue,
9    InvalidRange,
10    InvalidRangeStart(Box<TimeUnitError<'a>>),
11    InvalidRangeEnd(Box<TimeUnitError<'a>>),
12    InvalidStep,
13    OutOfBounds
14}
15
16impl<'a> TimeUnitErrorKind<'a> {
17    pub fn err(self, value: &'a str) -> TimeUnitError<'a> {
18        TimeUnitError {
19            input: value,
20            kind: self
21        }
22    }
23}
24
25#[derive(Debug)]
26pub struct TimeUnitError<'a> {
27    input: &'a str,
28    kind: TimeUnitErrorKind<'a>
29}
30
31impl<'a> std::error::Error for TimeUnitError<'a> {}
32
33impl<'a> fmt::Display for TimeUnitError<'a> {
34    fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
35        use TimeUnitErrorKind::*;
36
37        write!(f, "`{}`: ", self.input)?;
38
39        match &self.kind {
40            InvalidValue => write!(f, "invalid value"),
41            InvalidRange => write!(f, "invalid range"),
42            InvalidRangeStart(cause) => write!(f, "invalid range start value => {}", cause),
43            InvalidRangeEnd(cause) => write!(f, "invalid range end value => {}", cause),
44            InvalidStep => write!(f, "invalid step"),
45            OutOfBounds => write!(f, "out of bounds")
46        }?;
47
48        Ok(())
49    }
50}
51
52#[derive(Debug)]
53pub enum CronErrorKind<'a> {
54    InvalidSyntax,
55    InvalidTimeUnit(TimeUnitKind, TimeUnitError<'a>)
56}
57
58impl<'a> CronErrorKind<'a> {
59    pub fn err(self, input: &'a str) -> CronError<'a> {
60        CronError {
61            input,
62            kind: self
63        }
64    }
65}
66
67#[derive(Debug)]
68pub struct CronError<'a> {
69    input: &'a str,
70    kind: CronErrorKind<'a>
71}
72
73impl<'a> std::error::Error for CronError<'a> {}
74
75impl<'a> fmt::Display for CronError<'a> {
76    fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
77        use CronErrorKind::*;
78
79        write!(f, "`{}`: ", self.input)?;
80
81        match &self.kind {
82            InvalidSyntax => write!(f, "invalid cron syntax"),
83            InvalidTimeUnit(kind, err) => write!(f, "invalid {} => {}", kind, err),
84        }?;
85
86        Ok(())
87    }
88}