diff --git a/core/src/codegen/variant_data.rs b/core/src/codegen/variant_data.rs index c36a263..b1f4450 100644 --- a/core/src/codegen/variant_data.rs +++ b/core/src/codegen/variant_data.rs @@ -58,11 +58,17 @@ impl<'a> FieldsGen<'a> { quote!( for __item in __items { - if let ::syn::NestedMeta::Meta(ref __inner) = *__item { - let __name = ::darling::util::path_to_string(__inner.path()); - match __name.as_str() { - #(#arms)* - __other => { #handle_unknown } + match *__item { + ::syn::NestedMeta::Meta(ref __inner) => { + let __name = ::darling::util::path_to_string(__inner.path()); + match __name.as_str() { + #(#arms)* + __other => { #handle_unknown } + } + } + ::syn::NestedMeta::Lit(ref __inner) => { + __errors.push(::darling::Error::unsupported_format("literal") + .with_span(__inner)); } } } diff --git a/tests/from_meta.rs b/tests/from_meta.rs new file mode 100644 index 0000000..7523de3 --- /dev/null +++ b/tests/from_meta.rs @@ -0,0 +1,66 @@ +use darling::{Error, FromMeta}; +use syn::parse_quote; + +#[derive(Debug, FromMeta)] +struct Meta { + #[darling(default)] + meta1: Option, + #[darling(default)] + meta2: bool, +} + +#[test] +fn nested_meta_meta_value() { + let meta = Meta::from_list(&vec![parse_quote! { + meta1 = "thefeature" + }]) + .unwrap(); + assert_eq!(meta.meta1, Some("thefeature".to_string())); + assert_eq!(meta.meta2, false); +} + +#[test] +fn nested_meta_meta_bool() { + let meta = Meta::from_list(&vec![parse_quote! { + meta2 + }]) + .unwrap(); + assert_eq!(meta.meta1, None); + assert_eq!(meta.meta2, true); +} + +#[test] +fn nested_meta_lit_string_errors() { + let err = Meta::from_list(&vec![parse_quote! { + "meta2" + }]) + .unwrap_err(); + assert_eq!( + err.to_string(), + Error::unsupported_format("literal").to_string() + ); +} + +#[test] +fn nested_meta_lit_integer_errors() { + let err = Meta::from_list(&vec![parse_quote! { + 2 + }]) + .unwrap_err(); + assert_eq!( + err.to_string(), + Error::unsupported_format("literal").to_string() + ); +} + +#[test] +fn nested_meta_lit_bool_errors() { + let err = Meta::from_list(&vec![parse_quote! { + true + }]) + .unwrap_err(); + assert_eq!( + err.to_string(), + Error::unsupported_format("literal").to_string() + ); +}