distributed_verification/
error_handling.rs1use crate::Result;
2pub fn merge_results<I: IntoIterator<Item = (Result<()>, &'static str)>>(results: I) -> Result<()> {
3 let mut result = Ok(());
4 for (res, msg) in results {
5 result = match (res, result) {
6 (Ok(()), Ok(())) => Ok(()),
7 (Err(new), Ok(())) => Err(eyre!("{msg}\n{new:?}\n")),
8 (Ok(()), Err(old)) => Err(old),
9 (Err(new), Err(old)) => Err(eyre!("{old:?}\n{msg}:\n{new}\n")),
10 };
11 }
12 result
13}
14
15#[cfg(test)]
16mod tests {
17 use super::*;
18 use expect_test::expect;
19
20 #[test]
21 fn all_ok() {
22 assert!(matches!(merge_results([(Ok(()), ""), (Ok(()), ""), (Ok(()), "")]), Ok(())));
23 }
24
25 #[test]
26 fn one_error() {
27 let res =
28 merge_results([(Err(eyre!("ERROR1")), "Msg for error1:"), (Ok(()), ""), (Ok(()), "")]);
29 expect![[r#"
30 Msg for error1:
31 ERROR1
32
33 Location:
34 src/error_handling.rs:28:33
35 "#]]
36 .assert_eq(&res.unwrap_err().to_string());
37
38 let res =
39 merge_results([(Ok(()), ""), (Err(eyre!("ERROR1")), "Msg for error1:"), (Ok(()), "")]);
40 expect![[r#"
41 Msg for error1:
42 ERROR1
43
44 Location:
45 src/error_handling.rs:39:47
46 "#]].assert_eq(&res.unwrap_err().to_string());
47
48 let res =
49 merge_results([(Ok(()), ""), (Ok(()), ""), (Err(eyre!("ERROR1")), "Msg for error1:")]);
50 expect![[r#"
51 Msg for error1:
52 ERROR1
53
54 Location:
55 src/error_handling.rs:49:61
56 "#]].assert_eq(&res.unwrap_err().to_string());
57 }
58
59 #[test]
60 fn two_errors() {
61 let res = merge_results([
62 (Ok(()), ""),
63 (Err(eyre!("ERROR1")), "Msg for error1:"),
64 (Err(eyre!("ERROR2")), "Msg for error2:"),
65 ]);
66 expect![[r#"
67 Msg for error1:
68 ERROR1
69
70 Location:
71 src/error_handling.rs:63:18
72
73
74 Location:
75 src/error_handling.rs:7:39
76 Msg for error2::
77 ERROR2
78 "#]]
79 .assert_eq(&res.unwrap_err().to_string());
80 }
81}