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}