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