Skip to content

Commit

Permalink
Emit Error when parsing FromMeta containing NestedMeta::Lit (#193)
Browse files Browse the repository at this point in the history
darling silently ignored literals in NestedMeta, which could indirectly cause confusing error messages if the user provided something that wasn't of the intended format.

This update makes that error more explicit, and includes tests to showcase the behavior.

Fixes #192
  • Loading branch information
leighmcculloch committed Sep 8, 2022
1 parent fad4cb7 commit 161587a
Show file tree
Hide file tree
Showing 2 changed files with 77 additions and 5 deletions.
16 changes: 11 additions & 5 deletions core/src/codegen/variant_data.rs
Expand Up @@ -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));
}
}
}
Expand Down
66 changes: 66 additions & 0 deletions 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<String>,
#[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()
);
}

0 comments on commit 161587a

Please sign in to comment.