1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
use syn::Error;
#[derive(Default)]
pub struct OptionalError(Option<Error>);
impl OptionalError {
pub fn new(error: Error) -> Self {
Self(Some(error))
}
pub fn error(&self) -> Option<&Error> {
self.0.as_ref()
}
pub fn error_mut(&mut self) -> Option<&mut Error> {
self.0.as_mut()
}
pub fn take(&mut self) -> Option<Error> {
self.0.take()
}
pub fn replace(&mut self, error: Error) -> Option<Error> {
self.0.replace(error)
}
pub fn combine(&mut self, error: Error) {
match self.0 {
None => self.0 = Some(error),
Some(ref mut prev) => prev.combine(error),
}
}
pub fn try_throw(self) -> Result<(), Error> {
match self.0 {
None => Ok(()),
Some(err) => Err(err),
}
}
}
#[cfg(test)]
mod tests {
use syn::__private::Span;
use super::*;
#[test]
fn should_combine() {
let mut collector = OptionalError::new(Error::new(Span::call_site(), "First Error"));
collector.combine(Error::new(Span::call_site(), "Second Error"));
let expected = r#"compile_error ! { "First Error" } compile_error ! { "Second Error" }"#;
let received = collector.try_throw().expect_err("expected error").to_compile_error().to_string();
assert_eq!(expected, received);
}
#[test]
fn should_replace() {
let mut collector = OptionalError::new(Error::new(Span::call_site(), "First Error"));
let existing = collector.replace(Error::new(Span::call_site(), "Second Error"));
let expected = r#"compile_error ! { "First Error" }"#;
let received = existing.expect("expected error").to_compile_error().to_string();
assert_eq!(expected, received);
let expected = r#"compile_error ! { "Second Error" }"#;
let received = collector.try_throw().expect_err("expected error").to_compile_error().to_string();
assert_eq!(expected, received);
}
#[test]
fn should_take() {
let mut collector = OptionalError::new(Error::new(Span::call_site(), "First Error"));
let existing = collector.take();
let expected = r#"compile_error ! { "First Error" }"#;
let received = existing.expect("expected error").to_compile_error().to_string();
assert_eq!(expected, received);
assert!(collector.try_throw().is_ok());
}
}