Path: blob/main/crates/test-macros/src/add_variants.rs
1692 views
use proc_macro2::{Span, TokenStream};1use quote::quote;2use syn::parse_macro_input;34pub fn run(5attr: proc_macro::TokenStream,6item: proc_macro::TokenStream,7) -> proc_macro::TokenStream {8expand_variants(9&parse_macro_input!(attr as syn::LitInt),10parse_macro_input!(item as syn::ItemEnum),11)12.unwrap_or_else(syn::Error::into_compile_error)13.into()14}1516fn expand_variants(count: &syn::LitInt, mut ty: syn::ItemEnum) -> syn::Result<TokenStream> {17let count = count18.base10_digits()19.parse::<usize>()20.map_err(|_| syn::Error::new(count.span(), "expected unsigned integer"))?;2122ty.variants = (0..count)23.map(|index| syn::Variant {24attrs: Vec::new(),25ident: syn::Ident::new(&format!("V{index}"), Span::call_site()),26fields: syn::Fields::Unit,27discriminant: None,28})29.collect();3031Ok(quote!(#ty))32}333435