blob: 1d4a5ae153ac51e9c55c7f18ed1d1dc695ce1ad4 (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
/// This is a dumping ground for all proc-macros used by passfish.
/// There's a corresponding runtime module in the main crate.
extern crate syn;
extern crate quote;
extern crate proc_macro;
use proc_macro::TokenStream;
use quote::quote;
/// Adds a global constant name ENUMTYPE_
/// Thanks, StackOverflow: https://stackoverflow.com/questions/41637978/how-to-get-the-number-of-elements-variants-in-an-enum-as-a-constant-value
#[proc_macro_derive(EnumVariantCount)]
pub fn derive_enum_variant_count(input: TokenStream) -> TokenStream {
let syn_item: syn::DeriveInput = syn::parse(input).unwrap();
let len = match syn_item.data {
syn::Data::Enum(enum_item) => enum_item.variants.len(),
_ => panic!("EnumVariantCount only works on Enums"),
};
let enum_name = syn_item.ident;
let result = quote! {
impl EnumVariantCount for #enum_name { fn variant_count() -> usize { #len } }
};
result.into()
}
|