diff --git a/core/src/from_meta.rs b/core/src/from_meta.rs index 6752059..7e50e4e 100644 --- a/core/src/from_meta.rs +++ b/core/src/from_meta.rs @@ -516,6 +516,33 @@ macro_rules! from_meta_lit { } } } + + impl FromMeta for Vec<$impl_ty> { + fn from_list(items: &[NestedMeta]) -> Result { + items + .iter() + .map(<$impl_ty as FromMeta>::from_nested_meta) + .collect() + } + + fn from_value(value: &syn::Lit) -> Result { + let expr_array = syn::ExprArray::from_value(value)?; + Self::from_expr(&syn::Expr::Array(expr_array)) + } + + fn from_expr(expr: &syn::Expr) -> Result { + match expr { + syn::Expr::Array(expr_array) => expr_array + .elems + .iter() + .map(<$impl_ty as FromMeta>::from_expr) + .collect::>>(), + syn::Expr::Lit(expr_lit) => Self::from_value(&expr_lit.lit), + syn::Expr::Group(g) => Self::from_expr(&g.expr), + _ => Err(Error::unexpected_expr_type(expr)), + } + } + } }; } @@ -1044,4 +1071,15 @@ mod tests { vec![0x50, 0xffffffff] ); } + + #[test] + fn test_lit_array() { + fm::>(quote!(ignore = "[\"Hello World\", \"Test Array\"]")); + fm::>(quote!(ignore = ["Hello World", "Test Array"])); + fm::>(quote!(ignore = "['a', 'b', 'c']")); + fm::>(quote!(ignore = "[true]")); + fm::>(quote!(ignore = "[]")); + fm::>(quote!(ignore = [])); + fm::>(quote!(ignore = [true, false])); + } }