as_derive_utils/
to_token_fn.rs

1use proc_macro2::TokenStream;
2use quote::ToTokens;
3
4use std::cell::RefCell;
5
6/// Used to more easily implement ToTokens.
7pub struct ToTokenFnMut<F> {
8    func: RefCell<F>,
9}
10
11impl<F> ToTokenFnMut<F>
12where
13    F: FnMut(&mut TokenStream),
14{
15    pub fn new(f: F) -> Self {
16        Self {
17            func: RefCell::new(f),
18        }
19    }
20    #[allow(dead_code)]
21    pub fn boxed<'a>(f: F) -> Box<dyn ToTokens + 'a>
22    where
23        F: 'a,
24    {
25        Box::new(Self::new(f))
26    }
27}
28
29impl<F> ToTokens for ToTokenFnMut<F>
30where
31    F: FnMut(&mut TokenStream),
32{
33    fn to_tokens(&self, tokens: &mut TokenStream) {
34        RefCell::borrow_mut(&self.func)(tokens);
35    }
36}