From 5d182997d9597c6085d615685e84929e3c05934a Mon Sep 17 00:00:00 2001 From: Gabriel Simmer Date: Thu, 4 Jul 2024 15:23:31 +0100 Subject: [PATCH] More macro! --- src/lib.rs | 26 ++++++++++++++++++++++++++ src/manifests/mod.rs | 4 ++-- 2 files changed, 28 insertions(+), 2 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 5e7cb6b..0b47e81 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -27,3 +27,29 @@ pub fn manifest_list(dir: proc_macro::TokenStream) -> proc_macro::TokenStream { gen.into() } + +#[proc_macro] +pub fn mod_manifest_list(dir: proc_macro::TokenStream) -> proc_macro::TokenStream { + let dir = dir.to_string(); + let dir = dir.trim_matches('"'); + let paths: Vec = fs::read_dir(dir).unwrap().filter_map(|entry| { + let path = entry.ok()?.path(); + if path.is_file() && path.file_name()?.to_str() != Some("mod.rs") { + path.file_name()?.to_str().map(|s| s.to_owned().replace(".rs", "")) + } else { + None + } + }).collect(); + + // Generate the output tokens + let paths: Vec = paths.iter().map(|path| { + let ident = syn::Ident::new(path, proc_macro2::Span::call_site()); + quote! { mod #ident; } + }).collect(); + + let gen = quote! { + #(#paths)* + }; + + gen.into() +} diff --git a/src/manifests/mod.rs b/src/manifests/mod.rs index 2513ddf..b3cd9f3 100644 --- a/src/manifests/mod.rs +++ b/src/manifests/mod.rs @@ -1,8 +1,8 @@ -use infra_rs::manifest_list; +use infra_rs::{mod_manifest_list, manifest_list}; use crate::infra_rs::ResourceList; -mod vaultwarden; +mod_manifest_list!("./src/manifests"); pub fn render() -> ResourceList { let resources = manifest_list!("./src/manifests");