1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
extern crate proc_macro; use proc_macro::TokenStream; use syn::parse::Error as ParseError; mod signal; trait Output { fn process(self) -> TokenStream; } impl Output for proc_macro2::TokenStream { fn process(self) -> TokenStream { self.into() } } impl Output for Result<proc_macro2::TokenStream, ParseError> { fn process(self) -> TokenStream { match self { Ok(ts) => ts.into(), Err(e) => e.to_compile_error().into(), } } } macro_rules! create_derive( ($mod_:ident, $trait_:ident, $fn_name: ident $(,$attribute:ident)* $(,)?) => { #[proc_macro_derive($trait_, attributes($($attribute),*))] pub fn $fn_name(input: TokenStream) -> TokenStream { let ast = syn::parse(input).unwrap(); Output::process($mod_::expand(&ast, stringify!($trait_))) } } ); create_derive!(signal, Signal, signal_derive, Value);