Skip to content

Commit

Permalink
Allow multiple declarations of strum_discriminants attribute.
Browse files Browse the repository at this point in the history
  • Loading branch information
azriel91 committed Sep 20, 2018
1 parent c28616d commit d71e593
Show file tree
Hide file tree
Showing 2 changed files with 27 additions and 14 deletions.
23 changes: 9 additions & 14 deletions strum_macros/src/enum_discriminants.rs
Expand Up @@ -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::<Vec<_>>());
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::<Vec<_>>()
},
);
let discriminant_attrs = get_meta_list(type_meta.iter(), "strum_discriminants")
.flat_map(|meta| extract_list_metas(meta).collect::<Vec<_>>())
.collect::<Vec<&syn::Meta>>();
let derives = get_meta_list(discriminant_attrs.iter().map(|&m| m), "derive")
.flat_map(extract_list_metas)
.filter_map(get_meta_ident)
.collect::<Vec<_>>();

let derives = quote! {
#[derive(Clone, Copy, Debug, PartialEq, Eq, #(#derives),*)]
Expand All @@ -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);
Expand Down
18 changes: 18 additions & 0 deletions strum_tests/tests/enum_discriminants.rs
Expand Up @@ -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::<Vec<_>>();
let expected = vec![SplitAttributesBoo::Variant0, SplitAttributesBoo::Variant1];

assert_eq!(expected, discriminants);
assert_eq!("Variant0", format!("{}", SplitAttributesBoo::Variant0));
}

0 comments on commit d71e593

Please sign in to comment.