Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
bytecodealliance
GitHub Repository: bytecodealliance/wasmtime
Path: blob/main/crates/test-macros/src/add_variants.rs
1692 views
1
use proc_macro2::{Span, TokenStream};
2
use quote::quote;
3
use syn::parse_macro_input;
4
5
pub fn run(
6
attr: proc_macro::TokenStream,
7
item: proc_macro::TokenStream,
8
) -> proc_macro::TokenStream {
9
expand_variants(
10
&parse_macro_input!(attr as syn::LitInt),
11
parse_macro_input!(item as syn::ItemEnum),
12
)
13
.unwrap_or_else(syn::Error::into_compile_error)
14
.into()
15
}
16
17
fn expand_variants(count: &syn::LitInt, mut ty: syn::ItemEnum) -> syn::Result<TokenStream> {
18
let count = count
19
.base10_digits()
20
.parse::<usize>()
21
.map_err(|_| syn::Error::new(count.span(), "expected unsigned integer"))?;
22
23
ty.variants = (0..count)
24
.map(|index| syn::Variant {
25
attrs: Vec::new(),
26
ident: syn::Ident::new(&format!("V{index}"), Span::call_site()),
27
fields: syn::Fields::Unit,
28
discriminant: None,
29
})
30
.collect();
31
32
Ok(quote!(#ty))
33
}
34
35