1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
use proc_macro::TokenStream;
use proc_macro2::Span;
use quote::quote;
use syn::{parse_macro_input, Ident, ItemFn};

#[proc_macro_attribute]
pub fn register(_attr: TokenStream, input: TokenStream) -> TokenStream {
    let item = parse_macro_input!(input as ItemFn);
    let fn_name = item.sig.ident.to_string().replacen("on_", "has_", 1);
    let fn_name = Ident::new(&fn_name, Span::call_site());
    let output = quote! {
        fn #fn_name(&self) -> bool {
            true
        }
        #item
    };
    output.into()
}