| 12345678910111213141516171819202122232425262728293031323334353637383940414243 | use quote::ToTokens;use std::{cell::RefCell, fmt::Display, thread};#[derive(Default)]pub struct Ctxt {    errors: RefCell<Option<Vec<syn::Error>>>,}impl Ctxt {    pub fn new() -> Self {        Ctxt {            errors: RefCell::new(Some(Vec::new())),        }    }    pub fn error_spanned_by<A: ToTokens, T: Display>(&self, obj: A, msg: T) {        self.errors            .borrow_mut()            .as_mut()            .unwrap()            .push(syn::Error::new_spanned(obj.into_token_stream(), msg));    }    pub fn syn_error(&self, err: syn::Error) {        self.errors.borrow_mut().as_mut().unwrap().push(err);    }    pub fn check(self) -> Result<(), Vec<syn::Error>> {        let errors = self.errors.borrow_mut().take().unwrap();        match errors.len() {            0 => Ok(()),            _ => Err(errors),        }    }}impl Drop for Ctxt {    fn drop(&mut self) {        if !thread::panicking() && self.errors.borrow().is_some() {            panic!("forgot to check for errors");        }    }}
 |