Path: blob/main/crates/test-macros/src/flags_test.rs
1692 views
use proc_macro2::TokenStream;1use quote::{format_ident, quote};2use syn::parse::{Parse, ParseStream};3use syn::{Error, Result, Token, parse_macro_input};45#[derive(Debug)]6struct FlagsTest {7name: String,8flag_count: usize,9}1011impl Parse for FlagsTest {12fn parse(input: ParseStream) -> Result<Self> {13let name = input.parse::<syn::Ident>()?.to_string();14input.parse::<Token![,]>()?;15let flag_count = input.parse::<syn::LitInt>()?.base10_parse()?;1617Ok(Self { name, flag_count })18}19}2021pub fn run(input: proc_macro::TokenStream) -> proc_macro::TokenStream {22expand(&parse_macro_input!(input as FlagsTest))23.unwrap_or_else(Error::into_compile_error)24.into()25}2627fn expand(test: &FlagsTest) -> Result<TokenStream> {28let name = format_ident!("{}", test.name);29let flags = (0..test.flag_count)30.map(|index| {31let name = format_ident!("F{}", index);32quote!(const #name;)33})34.collect::<TokenStream>();3536let expanded = quote! {37wasmtime::component::flags! {38#name {39#flags40}41}42};4344Ok(expanded)45}464748