1 use proc_macro::TokenStream; 2 use proc_macro2::{Ident, Span}; 3 use quote::quote; 4 5 #[proc_macro] 6 pub fn foreach(input: TokenStream) -> TokenStream { 7 let input = proc_macro2::TokenStream::from(input); 8 let mut cwd = std::env::current_dir().unwrap(); 9 cwd.push("crates/component-macro/tests/codegen"); 10 let mut result = Vec::new(); 11 for f in cwd.read_dir().unwrap() { 12 let f = f.unwrap().path(); 13 if f.extension().and_then(|s| s.to_str()) == Some("wit") || f.is_dir() { 14 let name = f.file_stem().unwrap().to_str().unwrap(); 15 let ident = Ident::new(&name.replace("-", "_"), Span::call_site()); 16 let path = f.to_str().unwrap(); 17 result.push(quote! { 18 #input!(#ident #name #path); 19 }); 20 } 21 } 22 (quote!( #(#result)*)).into() 23 } 24