| use quote::ToTokens; |
| use std::fmt::Display; |
| use syn::{Error, Result}; |
| |
| pub struct Errors { |
| errors: Vec<Error>, |
| } |
| |
| impl Errors { |
| pub fn new() -> Self { |
| Errors { errors: Vec::new() } |
| } |
| |
| pub fn error(&mut self, sp: impl ToTokens, msg: impl Display) { |
| self.errors.push(Error::new_spanned(sp, msg)); |
| } |
| |
| pub fn push(&mut self, error: Error) { |
| self.errors.push(error); |
| } |
| |
| pub fn propagate(&mut self) -> Result<()> { |
| let mut iter = self.errors.drain(..); |
| let mut all_errors = match iter.next() { |
| Some(err) => err, |
| None => return Ok(()), |
| }; |
| for err in iter { |
| all_errors.combine(err); |
| } |
| Err(all_errors) |
| } |
| } |