use std::cell::RefCell;
pub struct Ctxt {
errors: RefCell<Option<Vec<syn::Error>>>,
}
impl Ctxt {
pub fn new() -> Self {
Self {
errors: RefCell::new(Some(Vec::new())),
}
}
pub fn syn_error(&self, err: syn::Error) {
self.errors.borrow_mut().as_mut().unwrap().push(err)
}
pub fn check(self) -> syn::Result<()> {
let mut errors = self.errors.take().unwrap().into_iter();
let mut combined = match errors.next() {
Some(first) => first,
None => return Ok(()),
};
for rest in errors {
combined.combine(rest);
}
Err(combined)
}
}
impl Drop for Ctxt {
fn drop(&mut self) {
if !std::thread::panicking() && self.errors.borrow().is_some() {
panic!("forgot to check for errors");
}
}
}