diff options
Diffstat (limited to 'rust_macro/src/lib.rs')
| -rw-r--r-- | rust_macro/src/lib.rs | 24 |
1 files changed, 24 insertions, 0 deletions
diff --git a/rust_macro/src/lib.rs b/rust_macro/src/lib.rs new file mode 100644 index 0000000..1d4a5ae --- /dev/null +++ b/rust_macro/src/lib.rs @@ -0,0 +1,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() +} |
