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

#[proc_macro_attribute]
pub fn marker_blanket(_: TokenStream, input: TokenStream) -> TokenStream {
    let input = parse_macro_input!(input as ItemTrait);
    let name = input.ident.clone();
    let supertraits = input.supertraits.clone();

    let expanded = quote! {
        #input
        impl<T: #supertraits> #name for T {}
    };

    proc_macro::TokenStream::from(expanded)
}