pyo3_macros_backend/
combine_errors.rs

1pub(crate) trait CombineErrors: Iterator {
2    type Ok;
3    fn try_combine_syn_errors(self) -> syn::Result<Vec<Self::Ok>>;
4}
5
6impl<I, T> CombineErrors for I
7where
8    I: Iterator<Item = syn::Result<T>>,
9{
10    type Ok = T;
11
12    fn try_combine_syn_errors(self) -> syn::Result<Vec<Self::Ok>> {
13        let mut oks: Vec<Self::Ok> = Vec::new();
14        let mut errors: Vec<syn::Error> = Vec::new();
15
16        for res in self {
17            match res {
18                Ok(val) => oks.push(val),
19                Err(e) => errors.push(e),
20            }
21        }
22
23        let mut err_iter = errors.into_iter();
24        let mut err = match err_iter.next() {
25            // There are no errors
26            None => return Ok(oks),
27            Some(e) => e,
28        };
29
30        for e in err_iter {
31            err.combine(e);
32        }
33
34        Err(err)
35    }
36}