1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
use proc_macro::TokenStream;
use quote::{format_ident, quote};

#[proc_macro_attribute]
pub fn testgen(attr: TokenStream, item: TokenStream) -> TokenStream {
    let item: proc_macro2::TokenStream = proc_macro2::TokenStream::from(item);
    let attr: proc_macro2::TokenStream = proc_macro2::TokenStream::from(attr);
    let macro_ident = format_ident!("testgen_{}", attr.to_string());

    let macro_gen = quote! {
        #[macro_export]
        macro_rules! #macro_ident {
            () => {
                mod #attr {
                    use super::*;

                    #item
                }
            };
        }
    };

    macro_gen.into()
}