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 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79
extern crate proc_macro; use proc_macro::TokenStream; use quote::quote; use syn::{parse_macro_input, DeriveInput}; #[proc_macro_derive(Pipeline)] pub fn derive_pipeline(input: TokenStream) -> TokenStream { let input = parse_macro_input!(input as DeriveInput); let ident = &input.ident; let gen = quote! { impl render::Pipeline for #ident { fn box_eq(&self, other: &dyn Any) -> bool { other.downcast_ref::<Self>().map_or(false, |a| self == a) } fn as_any(&self) -> &dyn Any { self } fn clone_box(&self) -> Box<dyn render::Pipeline> { Box::new(self.clone()) } } }; TokenStream::from(gen) } #[proc_macro_derive(AsAny)] pub fn derive_as_any(input: TokenStream) -> TokenStream { let input = parse_macro_input!(input as DeriveInput); let ident = &input.ident; let gen = quote! { impl AsAny for #ident { fn as_any(&self) -> &dyn Any { self } fn as_any_mut(&mut self) -> &mut dyn Any { self } } }; TokenStream::from(gen) } #[proc_macro_derive(Event)] pub fn derive_event(input: TokenStream) -> TokenStream { let input = parse_macro_input!(input as DeriveInput); let ident = &input.ident; let gen = quote! { impl Event for #ident {} }; TokenStream::from(gen) } #[proc_macro_derive(IntoHandler)] pub fn derive_into_handler(input: TokenStream) -> TokenStream { let input = parse_macro_input!(input as DeriveInput); let ident = &input.ident; let gen = quote! { impl Into<Rc<dyn EventHandler>> for #ident { fn into(self) -> Rc<dyn EventHandler> { Rc::new(self) } } }; TokenStream::from(gen) }