extern crate proc_macro2;
#[proc_macro_attribute]
pub fn group(
args: proc_macro::TokenStream,
tokens: proc_macro::TokenStream,
) -> proc_macro::TokenStream {
let tokens = proc_macro2::TokenStream::from(tokens);
let mut groups: Vec<syn::Ident> =
syn::parse_macro_input!(args with syn::punctuated::Punctuated::<syn::Ident, syn::Token![,]>::parse_terminated)
.into_iter()
.collect();
use sha2::Digest;
let digest = sha2::Sha256::digest(&tokens.to_string());
let hash = hex::encode(digest);
let mut body = tokens;
while let Some(group) = groups.pop() {
body = quote::quote! {
mod #group {
use super::*;
#body
}
};
}
let modname = syn::Ident::new(&format!("g{}", &hash[0..4]), proc_macro2::Span::call_site());
body = quote::quote! {
mod #modname {
use super::*;
#body
}
};
body.into()
}