Skip to content

Commit

Permalink
Added the ability to rename derived EnumDiscriminants.
Browse files Browse the repository at this point in the history
  • Loading branch information
azriel91 committed Sep 20, 2018
1 parent 068b6c8 commit 6b4b8e9
Show file tree
Hide file tree
Showing 4 changed files with 35 additions and 6 deletions.
13 changes: 8 additions & 5 deletions 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,
Expand All @@ -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;
Expand Down
9 changes: 9 additions & 0 deletions strum_macros/src/helpers.rs
Expand Up @@ -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<String> {
use syn::{Lit, MetaNameValue, NestedMeta};
meta.iter()
Expand Down
2 changes: 1 addition & 1 deletion strum_macros/src/lib.rs
Expand Up @@ -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();
Expand Down
17 changes: 17 additions & 0 deletions strum_tests/tests/enum_discriminants.rs
Expand Up @@ -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::<Vec<_>>();
let expected = vec![EnumBoo::Variant0, EnumBoo::Variant1];

assert_eq!(expected, discriminants);
}

0 comments on commit 6b4b8e9

Please sign in to comment.