Skip to content

Commit

Permalink
Improve enum shape validation (#178)
Browse files Browse the repository at this point in the history
* Apply shape validation to enum with no variants. Previously, this would not have produced an error.
* If the receiver doesn't support any enum shapes, surface one diagnostic instead of one per variant
  • Loading branch information
sreenathkrishnan committed Apr 13, 2022
1 parent a0fb9cc commit 445e6bb
Show file tree
Hide file tree
Showing 2 changed files with 26 additions and 9 deletions.
28 changes: 19 additions & 9 deletions core/src/options/shape.rs
Expand Up @@ -72,18 +72,28 @@ impl ToTokens for Shape {
} else {
let en = &self.enum_values;
let st = &self.struct_values;

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! {
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
}

for variant in &data.variants {
validate_variant(&variant.fields)?;
}

Ok(())
#enum_validation
}
::syn::Data::Struct(ref struct_data) => {
let data = &struct_data.fields;
Expand Down
7 changes: 7 additions & 0 deletions tests/supports.rs
Expand Up @@ -46,6 +46,12 @@ mod source {
}
}

pub fn empty_enum() -> DeriveInput {
parse_quote! {
enum Hello {}
}
}

pub fn named_struct() -> DeriveInput {
parse_quote! {
struct Hello {
Expand Down Expand Up @@ -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();
}

0 comments on commit 445e6bb

Please sign in to comment.