Skip to content

Commit 700b375

Browse files
committed
config_type: forward impl Display for single-fielded enums
1 parent e1347ae commit 700b375

File tree

1 file changed

+30
-7
lines changed

1 file changed

+30
-7
lines changed

config_proc_macro/src/item_enum.rs

Lines changed: 30 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -123,13 +123,36 @@ fn impl_doc_hint(ident: &syn::Ident, variants: &Variants) -> TokenStream {
123123
}
124124

125125
fn impl_display(ident: &syn::Ident, variants: &Variants) -> TokenStream {
126-
let vs = variants
127-
.iter()
128-
.filter(|v| is_unit(v))
129-
.map(|v| (config_value_of_variant(v), &v.ident));
130-
let match_patterns = fold_quote(vs, |(s, v)| {
131-
quote! {
132-
#ident::#v => write!(f, "{}", #s),
126+
let match_patterns = fold_quote(variants, |v| {
127+
let variant = &v.ident;
128+
match &v.fields {
129+
syn::Fields::Unit => {
130+
let s = config_value_of_variant(v);
131+
quote! {
132+
#ident::#variant => write!(f, "{}", #s),
133+
}
134+
}
135+
syn::Fields::Named(x) if x.named.len() == 1 => {
136+
let x = &x.named[0];
137+
quote! {
138+
#ident::#variant { #x } => write!(f, "{}", #x),
139+
}
140+
}
141+
syn::Fields::Named(x) => unimplemented!(
142+
"cannot implement display for variant with {} named fileds",
143+
x.named.len()
144+
),
145+
syn::Fields::Unnamed(x) if x.unnamed.len() == 1 => {
146+
quote! {
147+
#ident::#variant(x) => write!(f, "{}", x),
148+
}
149+
}
150+
syn::Fields::Unnamed(x) => {
151+
unimplemented!(
152+
"cannot implement display for variant with {} named fileds",
153+
x.unnamed.len()
154+
)
155+
}
133156
}
134157
});
135158
quote! {

0 commit comments

Comments
 (0)