Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
bytecodealliance
GitHub Repository: bytecodealliance/wasmtime
Path: blob/main/crates/test-macros/src/flags_test.rs
1692 views
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 {
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
22
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
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
48