From b06dabd4bfcea8fc9e9702248a45292c76deafb7 Mon Sep 17 00:00:00 2001 From: Sreenath Krishnan Date: Mon, 11 Apr 2022 20:51:24 -0700 Subject: [PATCH 1/2] Handle validation of empty enum correctly --- core/src/options/shape.rs | 12 ++++++++++++ tests/supports.rs | 7 +++++++ 2 files changed, 19 insertions(+) diff --git a/core/src/options/shape.rs b/core/src/options/shape.rs index 41f6eec..b42454b 100644 --- a/core/src/options/shape.rs +++ b/core/src/options/shape.rs @@ -72,6 +72,14 @@ impl ToTokens for Shape { } else { let en = &self.enum_values; let st = &self.struct_values; + + let check_empty_enum = if en.supports_none() { + let ty = en.prefix.trim_end_matches('_'); + quote!(return ::darling::export::Err(::darling::Error::unsupported_shape(#ty));) + } else { + quote!() + }; + quote! { match *__body { ::syn::Data::Enum(ref data) => { @@ -79,6 +87,10 @@ impl ToTokens for Shape { #en } + if data.variants.is_empty() { + #check_empty_enum + } + for variant in &data.variants { validate_variant(&variant.fields)?; } diff --git a/tests/supports.rs b/tests/supports.rs index ae3f2f7..d6c7556 100644 --- a/tests/supports.rs +++ b/tests/supports.rs @@ -46,6 +46,12 @@ mod source { } } + pub fn empty_enum() -> DeriveInput { + parse_quote! { + enum Hello {} + } + } + pub fn named_struct() -> DeriveInput { parse_quote! { struct Hello { @@ -80,4 +86,5 @@ fn struct_named() { StructContainer::from_derive_input(&source::tuple_struct()).unwrap_err(); StructContainer::from_derive_input(&source::named_field_enum()).unwrap_err(); StructContainer::from_derive_input(&source::newtype_enum()).unwrap_err(); + StructContainer::from_derive_input(&source::empty_enum()).unwrap_err(); } From 1ddecc16cef9914c0ee0f6ace9791d2186162067 Mon Sep 17 00:00:00 2001 From: Sreenath Krishnan Date: Tue, 12 Apr 2022 22:55:30 -0700 Subject: [PATCH 2/2] If the receiver doesn't support any enum shapes, surface one diagnostic --- core/src/options/shape.rs | 28 +++++++++++++--------------- 1 file changed, 13 insertions(+), 15 deletions(-) diff --git a/core/src/options/shape.rs b/core/src/options/shape.rs index b42454b..481f906 100644 --- a/core/src/options/shape.rs +++ b/core/src/options/shape.rs @@ -73,29 +73,27 @@ impl ToTokens for Shape { let en = &self.enum_values; let st = &self.struct_values; - let check_empty_enum = if en.supports_none() { + let enum_validation = if en.supports_none() { let ty = en.prefix.trim_end_matches('_'); quote!(return ::darling::export::Err(::darling::Error::unsupported_shape(#ty));) } else { - quote!() + quote! { + fn validate_variant(data: &::syn::Fields) -> ::darling::Result<()> { + #en + } + + for variant in &data.variants { + validate_variant(&variant.fields)?; + } + + Ok(()) + } }; quote! { match *__body { ::syn::Data::Enum(ref data) => { - fn validate_variant(data: &::syn::Fields) -> ::darling::Result<()> { - #en - } - - if data.variants.is_empty() { - #check_empty_enum - } - - for variant in &data.variants { - validate_variant(&variant.fields)?; - } - - Ok(()) + #enum_validation } ::syn::Data::Struct(ref struct_data) => { let data = &struct_data.fields;