1 use proc_macro2::{Span, TokenStream};
2 use quote::quote;
3 use syn::parse_macro_input;
4 
run( attr: proc_macro::TokenStream, item: proc_macro::TokenStream, ) -> proc_macro::TokenStream5 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 
expand_variants(count: &syn::LitInt, mut ty: syn::ItemEnum) -> syn::Result<TokenStream>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