From 273b5e9f127ce2d4b985a4b96949a5efdc00854d Mon Sep 17 00:00:00 2001 From: Fuwn Date: Sun, 16 Apr 2023 15:42:59 -0700 Subject: fix(amenadiel): modules macro unwrap on none --- amenadiel/Cargo.toml | 1 + amenadiel/src/lib.rs | 35 ++++++++++++++--------------------- 2 files changed, 15 insertions(+), 21 deletions(-) diff --git a/amenadiel/Cargo.toml b/amenadiel/Cargo.toml index c94115d..c6cdf62 100644 --- a/amenadiel/Cargo.toml +++ b/amenadiel/Cargo.toml @@ -12,3 +12,4 @@ proc-macro = true [dependencies] quote = "1.0.26" # Quasi-quoting +syn = "2.0.15" # Source Code Parsing diff --git a/amenadiel/src/lib.rs b/amenadiel/src/lib.rs index 0c97269..0206037 100644 --- a/amenadiel/src/lib.rs +++ b/amenadiel/src/lib.rs @@ -29,6 +29,7 @@ use proc_macro::TokenStream; use quote::quote; +use syn::Ident; /// Legitimise and mount Locus modules /// @@ -37,40 +38,32 @@ use quote::quote; /// This *should* never panic, but if it does, we don't care. #[proc_macro] pub fn modules(input: TokenStream) -> TokenStream { - let mut tokens = input.into_iter(); - let mut span = if let Some(span) = tokens.next() { - span.span() - } else { - return quote::quote!().into(); - }; - - for token in tokens { - span = span.join(token.span()).unwrap(); - } - + 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 modules = quote!(); + let mut mounted_modules = quote!(); - span.source_text().unwrap().lines().for_each(|line| { - if line.contains("search") { + for module_name in input_modules { + if module_name == "search" { legitimised_modules.extend(quote!( pub mod search; )); - modules.extend(quote!(router.attach_stateless(search::module);)); + mounted_modules.extend(quote!(router.attach_stateless(search::module);)); } else { - let module_name = - quote::format_ident!("{}", line.trim_end_matches(',').trim_start()); - legitimised_modules.extend(quote!(mod #module_name;)); - modules.extend(quote!(router.attach_stateless(#module_name::module);)); + mounted_modules + .extend(quote!(router.attach_stateless(#module_name::module);)); } - }); + } quote! { #legitimised_modules pub fn module(router: &mut ::windmark::Router) { - #modules + #mounted_modules } } .into() -- cgit v1.2.3