diff --git a/strum_macros/src/enum_discriminants.rs b/strum_macros/src/enum_discriminants.rs index 91440ef1..f819a702 100644 --- a/strum_macros/src/enum_discriminants.rs +++ b/strum_macros/src/enum_discriminants.rs @@ -1,15 +1,11 @@ use proc_macro2::{Span, TokenStream}; use syn; -use helpers::{extract_meta, extract_meta_attrs}; +use helpers::{extract_meta, extract_meta_attrs, unique_meta_attr}; pub fn enum_discriminants_inner(ast: &syn::DeriveInput) -> TokenStream { let name = &ast.ident; let vis = &ast.vis; - let enum_discriminants_name = syn::Ident::new( - &format!("{}Discriminants", name.to_string()), - Span::call_site(), - ); let variants = match ast.data { syn::Data::Enum(ref v) => &v.variants, @@ -22,6 +18,13 @@ pub fn enum_discriminants_inner(ast: &syn::DeriveInput) -> TokenStream { #[derive(Clone, Copy, Debug, PartialEq, Eq, #(#discriminant_derives),*)] }; + let default_name = syn::Ident::new( + &format!("{}Discriminants", name.to_string()), + Span::call_site(), + ); + let enum_discriminants_name = + unique_meta_attr(&type_meta, "strum_discriminants_name").unwrap_or(&default_name); + let mut discriminants = Vec::new(); for variant in variants { let ident = &variant.ident; diff --git a/strum_macros/src/helpers.rs b/strum_macros/src/helpers.rs index a62aa756..5388f993 100644 --- a/strum_macros/src/helpers.rs +++ b/strum_macros/src/helpers.rs @@ -31,6 +31,15 @@ pub fn extract_meta_attrs<'meta>(meta: &'meta [Meta], attr: &str) -> Vec<&'meta }).collect() } +pub fn unique_meta_attr<'meta>(attrs: &'meta [Meta], attr: &str) -> Option<&'meta Ident> { + let mut curr = extract_meta_attrs(attrs, attr); + if curr.len() > 1 { + panic!("More than one `{}` attribute found on type", attr); + } + + curr.pop() +} + pub fn extract_attrs(meta: &[Meta], attr: &str, prop: &str) -> Vec { use syn::{Lit, MetaNameValue, NestedMeta}; meta.iter() diff --git a/strum_macros/src/lib.rs b/strum_macros/src/lib.rs index a48e79ba..8f7b4567 100644 --- a/strum_macros/src/lib.rs +++ b/strum_macros/src/lib.rs @@ -117,7 +117,7 @@ pub fn enum_properties(input: proc_macro::TokenStream) -> proc_macro::TokenStrea #[proc_macro_derive( EnumDiscriminants, - attributes(strum, strum_discriminants_derive) + attributes(strum, strum_discriminants_derive, strum_discriminants_name) )] pub fn enum_discriminants(input: proc_macro::TokenStream) -> proc_macro::TokenStream { let ast = syn::parse(input).unwrap(); diff --git a/strum_tests/tests/enum_discriminants.rs b/strum_tests/tests/enum_discriminants.rs index d635e31c..712fabb6 100644 --- a/strum_tests/tests/enum_discriminants.rs +++ b/strum_tests/tests/enum_discriminants.rs @@ -84,3 +84,20 @@ enum WithDefault { fn with_default_test() { assert!(WithDefaultDiscriminants::A != WithDefaultDiscriminants::B); } + +#[allow(dead_code)] +#[derive(Debug, Eq, PartialEq, EnumDiscriminants)] +#[strum_discriminants_derive(EnumIter)] +#[strum_discriminants_name(EnumBoo)] +enum Renamed { + Variant0(bool), + Variant1(i32), +} + +#[test] +fn renamed_test() { + let discriminants = EnumBoo::iter().collect::>(); + let expected = vec![EnumBoo::Variant0, EnumBoo::Variant1]; + + assert_eq!(expected, discriminants); +}