Skip to content

Commit

Permalink
Add impl From<MyEnum> for MyEnumDiscriminants.
Browse files Browse the repository at this point in the history
  • Loading branch information
azriel91 committed Sep 23, 2018
1 parent 236f41d commit f090491
Show file tree
Hide file tree
Showing 2 changed files with 41 additions and 0 deletions.
29 changes: 29 additions & 0 deletions strum_macros/src/enum_discriminants.rs
Expand Up @@ -8,6 +8,7 @@ use helpers::{
pub fn enum_discriminants_inner(ast: &syn::DeriveInput) -> TokenStream {
let name = &ast.ident;
let vis = &ast.vis;
let (impl_generics, ty_generics, where_clause) = ast.generics.split_for_impl();

let variants = match ast.data {
syn::Data::Enum(ref v) => &v.variants,
Expand Down Expand Up @@ -63,12 +64,40 @@ pub fn enum_discriminants_inner(ast: &syn::DeriveInput) -> TokenStream {
discriminants.push(quote!{ #(#attrs)* #ident });
}

// Add match arms for `From< TheEnum >
let arms = variants
.iter()
.map(|variant| {
let ident = &variant.ident;

use syn::Fields::*;
let params = match variant.fields {
Unit => quote!{},
Unnamed(ref _fields) => {
quote! { (..) }
}
Named(ref _fields) => {
quote! { { .. } }
}
};

quote! { #name::#ident #params => #discriminants_name::#ident }
}).collect::<Vec<_>>();

quote!{
/// Auto-generated discriminant enum variants
#derives
#(#pass_though_attributes)*
#vis enum #discriminants_name {
#(#discriminants),*
}

impl #impl_generics ::std::convert::From< #name #ty_generics > for #discriminants_name #where_clause {
fn from(s: #name #ty_generics) -> #discriminants_name {
match s {
#(#arms),*
}
}
}
}
}
12 changes: 12 additions & 0 deletions strum_tests/tests/enum_discriminants.rs
Expand Up @@ -145,3 +145,15 @@ fn arbitrary_attributes_pass_through() {
PassThroughBoo::from_str("dark_black").unwrap()
);
}

#[derive(Debug, Eq, PartialEq, EnumDiscriminants)]
enum EnumInto {
A(bool),
B(i32),
}

#[test]
fn from_test() {
assert_eq!(EnumIntoDiscriminants::A, EnumInto::A(true).into());
assert_eq!(EnumIntoDiscriminants::B, EnumInto::B(1).into());
}

0 comments on commit f090491

Please sign in to comment.