enum_all_values_const/
lib.rs1extern crate proc_macro;
2extern crate syn;
3#[macro_use]
4extern crate quote;
5
6use proc_macro::TokenStream;
7
8#[proc_macro_derive(AllValues)]
9pub fn derive_all_variants(input: TokenStream) -> TokenStream {
10 let syn_item: syn::DeriveInput = syn::parse(input).unwrap();
11 let variants = match syn_item.data {
12 syn::Data::Enum(enum_item) => enum_item.variants.into_iter().map(|v| v.ident),
13 _ => panic!("AllValues only works on enums"),
14 };
15
16 let variants_amount = variants.len();
17
18 let enum_name = syn_item.ident;
19 let expanded = quote! {
20 impl #enum_name {
21 pub const ALL_VALUES: [#enum_name; #variants_amount] = [ #(#enum_name::#variants),* ];
22 }
23 };
24
25 expanded.into()
26}