diff --git a/src/macros/implement.rs b/src/macros/implement.rs new file mode 100644 index 0000000000000000000000000000000000000000..1a06e588c8d2400e4b527dff44f14466dbbce243 --- /dev/null +++ b/src/macros/implement.rs @@ -0,0 +1,23 @@ +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() +} diff --git a/src/macros/mod.rs b/src/macros/mod.rs index a0e61324ac18e700898ae89d05fa8a9fcab22a9a..8d7e2e5b755413423e4793d831cd7ff40bd3c238 100644 --- a/src/macros/mod.rs +++ b/src/macros/mod.rs @@ -1,6 +1,7 @@ mod admin; mod cargo; mod debug; +mod implement; mod refutable; mod rustc; mod utils; @@ -23,3 +24,6 @@ pub fn rustc_flags_capture(args: TokenStream) -> TokenStream { rustc::flags_capt #[proc_macro_attribute] pub fn refutable(args: TokenStream, input: TokenStream) -> TokenStream { refutable::refutable(args, input) } + +#[proc_macro_attribute] +pub fn implement(args: TokenStream, input: TokenStream) -> TokenStream { implement::implement(args, input) }