aboutsummaryrefslogtreecommitdiff
path: root/rust_macro/src/lib.rs
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()
}