1 use proc_macro2::TokenStream;
2 use quote::{format_ident, quote};
3 use syn::parse::{Parse, ParseStream};
4 use syn::{Error, Result, Token, parse_macro_input};
5
6 #[derive(Debug)]
7 struct FlagsTest {
8 name: String,
9 flag_count: usize,
10 }
11
12 impl Parse for FlagsTest {
parse(input: ParseStream) -> Result<Self>13 fn parse(input: ParseStream) -> Result<Self> {
14 let name = input.parse::<syn::Ident>()?.to_string();
15 input.parse::<Token![,]>()?;
16 let flag_count = input.parse::<syn::LitInt>()?.base10_parse()?;
17
18 Ok(Self { name, flag_count })
19 }
20 }
21
run(input: proc_macro::TokenStream) -> proc_macro::TokenStream22 pub fn run(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
23 expand(&parse_macro_input!(input as FlagsTest))
24 .unwrap_or_else(Error::into_compile_error)
25 .into()
26 }
27
expand(test: &FlagsTest) -> Result<TokenStream>28 fn expand(test: &FlagsTest) -> Result<TokenStream> {
29 let name = format_ident!("{}", test.name);
30 let flags = (0..test.flag_count)
31 .map(|index| {
32 let name = format_ident!("F{}", index);
33 quote!(const #name;)
34 })
35 .collect::<TokenStream>();
36
37 let expanded = quote! {
38 wasmtime::component::flags! {
39 #name {
40 #flags
41 }
42 }
43 };
44
45 Ok(expanded)
46 }
47