prcs/status_constraints/
matches.rs

1use super::StatusConstraint;
2use super::{ConstraintType, StatusCode};
3
4pub trait MatchStatusCode {
5    fn matches(&self, code: StatusCode) -> bool;
6}
7
8impl MatchStatusCode for StatusConstraint {
9    fn matches(&self, code: StatusCode) -> bool {
10        (match self.typ {
11            ConstraintType::Lte => code <= self.code,
12            ConstraintType::Lt => code < self.code,
13            ConstraintType::Eq => code == self.code,
14            ConstraintType::Gt => code > self.code,
15            ConstraintType::Gte => code >= self.code,
16        }) ^ self.negated
17    }
18}
19impl MatchStatusCode for Vec<StatusConstraint> {
20    fn matches(&self, code: StatusCode) -> bool {
21        self.iter().all(|constraint| constraint.matches(code))
22    }
23}
24impl MatchStatusCode for Vec<Vec<StatusConstraint>> {
25    fn matches(&self, code: StatusCode) -> bool {
26        self.iter().any(|constraints| constraints.matches(code))
27    }
28}
29
30#[cfg(test)]
31mod tests {
32    use super::{ConstraintType, MatchStatusCode, StatusConstraint};
33
34    #[test]
35    fn lt_match() {
36        assert!(StatusConstraint {
37            typ: ConstraintType::Lt,
38            code: 42,
39            negated: false
40        }
41        .matches(41))
42    }
43    #[test]
44    fn lt_mismatch() {
45        assert!(!StatusConstraint {
46            typ: ConstraintType::Lt,
47            code: 42,
48            negated: false
49        }
50        .matches(42))
51    }
52
53    #[test]
54    fn lte_match() {
55        assert!(StatusConstraint {
56            typ: ConstraintType::Lte,
57            code: 42,
58            negated: false
59        }
60        .matches(42))
61    }
62    #[test]
63    fn lte_mismatch() {
64        assert!(!StatusConstraint {
65            typ: ConstraintType::Lte,
66            code: 42,
67            negated: false
68        }
69        .matches(43))
70    }
71
72    #[test]
73    fn eq_match() {
74        assert!(StatusConstraint {
75            typ: ConstraintType::Eq,
76            code: 42,
77            negated: false
78        }
79        .matches(42))
80    }
81    #[test]
82    fn eq_mismatch() {
83        assert!(!StatusConstraint {
84            typ: ConstraintType::Eq,
85            code: 42,
86            negated: false
87        }
88        .matches(1337))
89    }
90
91    #[test]
92    fn gt_match() {
93        assert!(StatusConstraint {
94            typ: ConstraintType::Gt,
95            code: 42,
96            negated: false
97        }
98        .matches(43))
99    }
100    #[test]
101    fn gt_mismatch() {
102        assert!(!StatusConstraint {
103            typ: ConstraintType::Gt,
104            code: 42,
105            negated: false
106        }
107        .matches(42))
108    }
109
110    #[test]
111    fn gte_match() {
112        assert!(StatusConstraint {
113            typ: ConstraintType::Gte,
114            code: 42,
115            negated: false
116        }
117        .matches(42))
118    }
119    #[test]
120    fn gte_mismatch() {
121        assert!(!StatusConstraint {
122            typ: ConstraintType::Gte,
123            code: 42,
124            negated: false
125        }
126        .matches(41))
127    }
128
129    #[test]
130    fn negation() {
131        assert!(StatusConstraint {
132            typ: ConstraintType::Eq,
133            code: 42,
134            negated: true
135        }
136        .matches(1337))
137    }
138
139    #[test]
140    fn multiple_constraints() {
141        assert!(!vec![
142            StatusConstraint {
143                typ: ConstraintType::Eq,
144                code: 42,
145                negated: false
146            },
147            StatusConstraint {
148                typ: ConstraintType::Eq,
149                code: 1337,
150                negated: false
151            }
152        ]
153        .matches(42))
154    }
155
156    #[test]
157    fn constraint_options() {
158        assert!(vec![
159            vec![StatusConstraint {
160                typ: ConstraintType::Eq,
161                code: 42,
162                negated: false
163            }],
164            vec![StatusConstraint {
165                typ: ConstraintType::Eq,
166                code: 1337,
167                negated: false
168            }]
169        ]
170        .matches(42))
171    }
172}