aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFuwn <[email protected]>2023-04-16 15:42:59 -0700
committerFuwn <[email protected]>2023-04-16 15:42:59 -0700
commit273b5e9f127ce2d4b985a4b96949a5efdc00854d (patch)
tree8a941ebd2013f7aa43a3f0697a83616094edfe18
parentdeps(rust): bump to nightly-2023-04-15 (diff)
downloadlocus-273b5e9f127ce2d4b985a4b96949a5efdc00854d.tar.xz
locus-273b5e9f127ce2d4b985a4b96949a5efdc00854d.zip
fix(amenadiel): modules macro unwrap on none
-rw-r--r--amenadiel/Cargo.toml1
-rw-r--r--amenadiel/src/lib.rs35
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<Ident> = syn::parse_macro_input!(
+ input with syn::punctuated::Punctuated::<Ident, syn::Token![,]>::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()