prcs/status_constraints/
matches.rs1use 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}