blob: 04f21d8f41b742c679125625516d4a2f4aad3da2 [file] [log] [blame]
David Tolnaydf344a82020-05-03 23:23:18 -07001use quote::ToTokens;
2use std::fmt::Display;
3use syn::{Error, Result};
4
5pub struct Errors {
6 errors: Vec<Error>,
7}
8
9impl Errors {
10 pub fn new() -> Self {
11 Errors { errors: Vec::new() }
12 }
13
14 pub fn error(&mut self, sp: impl ToTokens, msg: impl Display) {
15 self.errors.push(Error::new_spanned(sp, msg));
16 }
17
18 pub fn propagate(&mut self) -> Result<()> {
19 let mut iter = self.errors.drain(..);
20 let mut all_errors = match iter.next() {
21 Some(err) => err,
22 None => return Ok(()),
23 };
24 for err in iter {
25 all_errors.combine(err);
26 }
27 Err(all_errors)
28 }
29}