#![deny( warnings, nonstandard_style, unused, future_incompatible, rust_2018_idioms, unsafe_code )] #![deny(clippy::all, clippy::nursery, clippy::pedantic)] #![recursion_limit = "128"] use {proc_macro::TokenStream, quote::quote, syn::Ident}; /// Legitimise and mount Locus modules /// /// # Panics /// /// This *should* never panic, but if it does, we don't care. #[proc_macro] pub fn modules(input: TokenStream) -> TokenStream { let input_modules: Vec = syn::parse_macro_input!( input with syn::punctuated::Punctuated::::parse_terminated ) .into_iter() .collect(); let mut legitimised_modules = quote!(); let mut mounted_modules = quote!(); for module_name in input_modules { if module_name == "search" || module_name == "blog" { legitimised_modules.extend(quote!( pub mod #module_name; )); } else { legitimised_modules.extend(quote!(mod #module_name;)); } mounted_modules .extend(quote!(router.attach_stateless(#module_name::module);)); } quote! { #legitimised_modules pub fn module(router: &mut ::windmark::router::Router) { #mounted_modules } } .into() }