1use std::fmt::{Display, Formatter, Result as FormatResult};
2
3#[derive(Clone, Debug)]
5pub struct ValidateOptionsResult {
6 succeeded: bool,
7 skipped: bool,
8 failed: bool,
9 failures: Vec<String>,
10}
11
12impl ValidateOptionsResult {
13 pub fn succeeded(&self) -> bool {
15 self.succeeded
16 }
17
18 pub fn skipped(&self) -> bool {
20 self.skipped
21 }
22
23 pub fn failed(&self) -> bool {
25 self.failed
26 }
27
28 pub fn failure_message(&self) -> String {
30 if self.failures.is_empty() {
31 String::new()
32 } else {
33 self.failures.join("; ")
34 }
35 }
36
37 pub fn failures(&self) -> &[String] {
39 &self.failures
40 }
41
42 pub fn skip() -> Self {
44 Self {
45 succeeded: false,
46 skipped: true,
47 failed: false,
48 failures: Vec::with_capacity(0),
49 }
50 }
51
52 pub fn success() -> Self {
54 Self {
55 succeeded: true,
56 skipped: false,
57 failed: false,
58 failures: Vec::with_capacity(0),
59 }
60 }
61
62 pub fn fail<S: AsRef<str>>(failure: S) -> Self {
68 Self::fail_many([failure].iter())
69 }
70
71 pub fn fail_many<S, I>(failures: I) -> Self
73 where
74 S: AsRef<str>,
75 I: Iterator<Item = S>,
76 {
77 Self {
78 succeeded: false,
79 skipped: false,
80 failed: true,
81 failures: failures.map(|f| f.as_ref().to_owned()).collect(),
82 }
83 }
84}
85
86impl Display for ValidateOptionsResult {
87 fn fmt(&self, formatter: &mut Formatter<'_>) -> FormatResult {
88 formatter.write_str(&self.failure_message())
89 }
90}
91
92pub trait ValidateOptions<T> {
94 fn validate(&self, name: Option<&str>, options: &T) -> ValidateOptionsResult;
101}
102
103#[cfg(test)]
104mod tests {
105
106 use super::*;
107
108 #[test]
109 fn success_should_indicate_succeed() {
110 let result = ValidateOptionsResult::success();
112
113 let succeeded = result.succeeded();
115
116 assert!(succeeded);
118 }
119
120 #[test]
121 fn skip_should_indicate_skipped() {
122 let result = ValidateOptionsResult::skip();
124
125 let skipped = result.skipped();
127
128 assert!(skipped);
130 }
131
132 #[test]
133 fn fail_should_return_failed() {
134 let result = ValidateOptionsResult::fail("");
136
137 let failed = result.failed();
139
140 assert!(failed);
142 }
143
144 #[test]
145 fn fail_should_return_message() {
146 let result = ValidateOptionsResult::fail("Failed");
148
149 let message = result.failure_message();
151
152 assert_eq!(&message, "Failed");
154 }
155
156 #[test]
157 fn fail_many_should_return_joined_message() {
158 let failures = ["Failure 1", "Failure 2"];
160 let result = ValidateOptionsResult::fail_many(failures.iter());
161
162 let message = result.failure_message();
164
165 assert_eq!(&message, "Failure 1; Failure 2");
167 }
168
169 #[test]
170 fn fail_many_should_return_failures() {
171 let expected = ["Failure 1", "Failure 2"];
173 let result = ValidateOptionsResult::fail_many(expected.iter());
174
175 let failures = result.failures();
177
178 assert_eq!(failures, &expected[..]);
180 }
181
182 #[test]
183 fn to_string_should_return_message() {
184 let result = ValidateOptionsResult::fail("Failed");
186 let message = result.failure_message();
187
188 let string = result.to_string();
190
191 assert_eq!(string, message);
193 }
194}