distributed_verification/
error_handling.rs

1use 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}