From b1951295de58bd83467c6f51d8f22b020e3d36f2 Mon Sep 17 00:00:00 2001 From: Kitsu Date: Sat, 10 Dec 2022 21:51:07 +0300 Subject: [PATCH] config_type: forward impl Display for single-fielded enums --- config_proc_macro/src/item_enum.rs | 37 ++++++++++++++++++++++++------ 1 file changed, 30 insertions(+), 7 deletions(-) diff --git a/config_proc_macro/src/item_enum.rs b/config_proc_macro/src/item_enum.rs index dac3cf0c018..12ebcf57650 100644 --- a/config_proc_macro/src/item_enum.rs +++ b/config_proc_macro/src/item_enum.rs @@ -123,13 +123,36 @@ fn impl_doc_hint(ident: &syn::Ident, variants: &Variants) -> TokenStream { } fn impl_display(ident: &syn::Ident, variants: &Variants) -> TokenStream { - let vs = variants - .iter() - .filter(|v| is_unit(v)) - .map(|v| (config_value_of_variant(v), &v.ident)); - let match_patterns = fold_quote(vs, |(s, v)| { - quote! { - #ident::#v => write!(f, "{}", #s), + let match_patterns = fold_quote(variants, |v| { + let variant = &v.ident; + match &v.fields { + syn::Fields::Unit => { + let s = config_value_of_variant(v); + quote! { + #ident::#variant => write!(f, "{}", #s), + } + } + syn::Fields::Named(x) if x.named.len() == 1 => { + let x = &x.named[0]; + quote! { + #ident::#variant { #x } => write!(f, "{}", #x), + } + } + syn::Fields::Named(x) => unimplemented!( + "cannot implement display for variant with {} named fileds", + x.named.len() + ), + syn::Fields::Unnamed(x) if x.unnamed.len() == 1 => { + quote! { + #ident::#variant(x) => write!(f, "{}", x), + } + } + syn::Fields::Unnamed(x) => { + unimplemented!( + "cannot implement display for variant with {} named fileds", + x.unnamed.len() + ) + } } }); quote! {