133d722a9Sopenharmony_ciuse quote::ToTokens; 233d722a9Sopenharmony_ciuse std::fmt::Display; 333d722a9Sopenharmony_ciuse syn::{Error, Result}; 433d722a9Sopenharmony_ci 533d722a9Sopenharmony_cipub struct Errors { 633d722a9Sopenharmony_ci errors: Vec<Error>, 733d722a9Sopenharmony_ci} 833d722a9Sopenharmony_ci 933d722a9Sopenharmony_ciimpl Errors { 1033d722a9Sopenharmony_ci pub fn new() -> Self { 1133d722a9Sopenharmony_ci Errors { errors: Vec::new() } 1233d722a9Sopenharmony_ci } 1333d722a9Sopenharmony_ci 1433d722a9Sopenharmony_ci pub fn error(&mut self, sp: impl ToTokens, msg: impl Display) { 1533d722a9Sopenharmony_ci self.errors.push(Error::new_spanned(sp, msg)); 1633d722a9Sopenharmony_ci } 1733d722a9Sopenharmony_ci 1833d722a9Sopenharmony_ci pub fn push(&mut self, error: Error) { 1933d722a9Sopenharmony_ci self.errors.push(error); 2033d722a9Sopenharmony_ci } 2133d722a9Sopenharmony_ci 2233d722a9Sopenharmony_ci pub fn propagate(&mut self) -> Result<()> { 2333d722a9Sopenharmony_ci let mut iter = self.errors.drain(..); 2433d722a9Sopenharmony_ci let mut all_errors = match iter.next() { 2533d722a9Sopenharmony_ci Some(err) => err, 2633d722a9Sopenharmony_ci None => return Ok(()), 2733d722a9Sopenharmony_ci }; 2833d722a9Sopenharmony_ci for err in iter { 2933d722a9Sopenharmony_ci all_errors.combine(err); 3033d722a9Sopenharmony_ci } 3133d722a9Sopenharmony_ci Err(all_errors) 3233d722a9Sopenharmony_ci } 3333d722a9Sopenharmony_ci} 34