diff --git a/strum_macros/src/enum_discriminants.rs b/strum_macros/src/enum_discriminants.rs index fb03156c..ab35a9b9 100644 --- a/strum_macros/src/enum_discriminants.rs +++ b/strum_macros/src/enum_discriminants.rs @@ -14,17 +14,13 @@ pub fn enum_discriminants_inner(ast: &syn::DeriveInput) -> TokenStream { // Derives for the generated enum let type_meta = extract_meta(&ast.attrs); - let discriminant_attrs = unique_meta_list(type_meta.iter(), "strum_discriminants") - .map(|meta| extract_list_metas(meta).collect::>()); - let derives = discriminant_attrs.as_ref().map_or_else( - || vec![], - |meta| { - get_meta_list(meta.iter().map(|&m| m), "derive") - .flat_map(extract_list_metas) - .filter_map(get_meta_ident) - .collect::>() - }, - ); + let discriminant_attrs = get_meta_list(type_meta.iter(), "strum_discriminants") + .flat_map(|meta| extract_list_metas(meta).collect::>()) + .collect::>(); + let derives = get_meta_list(discriminant_attrs.iter().map(|&m| m), "derive") + .flat_map(extract_list_metas) + .filter_map(get_meta_ident) + .collect::>(); let derives = quote! { #[derive(Clone, Copy, Debug, PartialEq, Eq, #(#derives),*)] @@ -35,9 +31,8 @@ pub fn enum_discriminants_inner(ast: &syn::DeriveInput) -> TokenStream { &format!("{}Discriminants", name.to_string()), Span::call_site(), ); - let discriminants_name = discriminant_attrs - .as_ref() - .and_then(|meta| unique_meta_list(meta.iter().map(|&m| m), "name")) + + let discriminants_name = unique_meta_list(discriminant_attrs.iter().map(|&m| m), "name") .map(extract_list_metas) .and_then(|metas| metas.filter_map(get_meta_ident).next()) .unwrap_or(&default_name); diff --git a/strum_tests/tests/enum_discriminants.rs b/strum_tests/tests/enum_discriminants.rs index c081c503..18900277 100644 --- a/strum_tests/tests/enum_discriminants.rs +++ b/strum_tests/tests/enum_discriminants.rs @@ -100,3 +100,21 @@ fn renamed_test() { assert_eq!(expected, discriminants); } + +#[allow(dead_code)] +#[derive(Debug, Eq, PartialEq, EnumDiscriminants)] +#[strum_discriminants(name(SplitAttributesBoo), derive(Display))] +#[strum_discriminants(derive(EnumIter))] +enum SplitAttributes { + Variant0(bool), + Variant1(i32), +} + +#[test] +fn split_attributes_test() { + let discriminants = SplitAttributesBoo::iter().collect::>(); + let expected = vec![SplitAttributesBoo::Variant0, SplitAttributesBoo::Variant1]; + + assert_eq!(expected, discriminants); + assert_eq!("Variant0", format!("{}", SplitAttributesBoo::Variant0)); +}