Skip to content
Snippets Groups Projects
implement.rs 586 B
Newer Older
  • Learn to ignore specific revisions
  • use proc_macro::TokenStream;
    use quote::{quote, ToTokens};
    use syn::{parse_macro_input, AttributeArgs, ItemFn, Meta, NestedMeta};
    
    pub(super) fn implement(args: TokenStream, input: TokenStream) -> TokenStream {
    	let args = parse_macro_input!(args as AttributeArgs);
    	let item = parse_macro_input!(input as ItemFn);
    
    	let NestedMeta::Meta(Meta::Path(receiver)) = args
    		.first()
    		.expect("missing path to trait or item to implement")
    	else {
    		panic!("invalid path to item for implement");
    	};
    
    	let out = quote! {
    		impl #receiver {
    			#item
    		}
    	};
    
    	out.into_token_stream().into()
    }