Filter the slice of expected field and variant names
This commit is contained in:
parent
d1325862f7
commit
ea99e8b686
@ -489,24 +489,25 @@ fn deserialize_item_enum(
|
|||||||
|
|
||||||
let type_name = item_attrs.name().deserialize_name();
|
let type_name = item_attrs.name().deserialize_name();
|
||||||
|
|
||||||
let variant_names_idents = variants.iter()
|
let variant_names_idents: Vec<_> = variants.iter()
|
||||||
.enumerate()
|
.enumerate()
|
||||||
.filter(|&(_, variant)| !variant.attrs.skip_deserializing())
|
.filter(|&(_, variant)| !variant.attrs.skip_deserializing())
|
||||||
.map(|(i, variant)| (variant.attrs.name().deserialize_name(), field_i(i)))
|
.map(|(i, variant)| (variant.attrs.name().deserialize_name(), field_i(i)))
|
||||||
.collect();
|
.collect();
|
||||||
|
|
||||||
|
let variants_stmt = {
|
||||||
|
let variant_names = variant_names_idents.iter().map(|&(ref name, _)| name);
|
||||||
|
quote! {
|
||||||
|
const VARIANTS: &'static [&'static str] = &[ #(#variant_names),* ];
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
let variant_visitor = deserialize_field_visitor(
|
let variant_visitor = deserialize_field_visitor(
|
||||||
variant_names_idents,
|
variant_names_idents,
|
||||||
item_attrs,
|
item_attrs,
|
||||||
true,
|
true,
|
||||||
);
|
);
|
||||||
|
|
||||||
let variant_names = variants.iter().map(|variant| variant.attrs.name().deserialize_name());
|
|
||||||
|
|
||||||
let variants_stmt = quote! {
|
|
||||||
const VARIANTS: &'static [&'static str] = &[ #(#variant_names),* ];
|
|
||||||
};
|
|
||||||
|
|
||||||
// Match arms to extract a variant from a string
|
// Match arms to extract a variant from a string
|
||||||
let variant_arms = variants.iter()
|
let variant_arms = variants.iter()
|
||||||
.enumerate()
|
.enumerate()
|
||||||
@ -713,12 +714,19 @@ fn deserialize_struct_visitor(
|
|||||||
fields: &[Field],
|
fields: &[Field],
|
||||||
item_attrs: &attr::Item,
|
item_attrs: &attr::Item,
|
||||||
) -> (Tokens, Tokens, Tokens) {
|
) -> (Tokens, Tokens, Tokens) {
|
||||||
let field_names_idents = fields.iter()
|
let field_names_idents: Vec<_> = fields.iter()
|
||||||
.enumerate()
|
.enumerate()
|
||||||
.filter(|&(_, field)| !field.attrs.skip_deserializing())
|
.filter(|&(_, field)| !field.attrs.skip_deserializing())
|
||||||
.map(|(i, field)| (field.attrs.name().deserialize_name(), field_i(i)))
|
.map(|(i, field)| (field.attrs.name().deserialize_name(), field_i(i)))
|
||||||
.collect();
|
.collect();
|
||||||
|
|
||||||
|
let fields_stmt = {
|
||||||
|
let field_names = field_names_idents.iter().map(|&(ref name, _)| name);
|
||||||
|
quote! {
|
||||||
|
const FIELDS: &'static [&'static str] = &[ #(#field_names),* ];
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
let field_visitor = deserialize_field_visitor(
|
let field_visitor = deserialize_field_visitor(
|
||||||
field_names_idents,
|
field_names_idents,
|
||||||
item_attrs,
|
item_attrs,
|
||||||
@ -733,11 +741,6 @@ fn deserialize_struct_visitor(
|
|||||||
item_attrs,
|
item_attrs,
|
||||||
);
|
);
|
||||||
|
|
||||||
let field_names = fields.iter().map(|field| field.attrs.name().deserialize_name());
|
|
||||||
let fields_stmt = quote! {
|
|
||||||
const FIELDS: &'static [&'static str] = &[ #(#field_names),* ];
|
|
||||||
};
|
|
||||||
|
|
||||||
(field_visitor, fields_stmt, visit_map)
|
(field_visitor, fields_stmt, visit_map)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -145,7 +145,7 @@ fn test_default_enum() {
|
|||||||
assert_de_tokens(
|
assert_de_tokens(
|
||||||
&DefaultEnum::Struct { a1: 1, a2: 2, a3: 3, a4: 0, a5: 123 },
|
&DefaultEnum::Struct { a1: 1, a2: 2, a3: 3, a4: 0, a5: 123 },
|
||||||
&[
|
&[
|
||||||
Token::EnumMapStart("DefaultEnum", "Struct", 5),
|
Token::EnumMapStart("DefaultEnum", "Struct", 3),
|
||||||
|
|
||||||
Token::EnumMapSep,
|
Token::EnumMapSep,
|
||||||
Token::Str("a1"),
|
Token::Str("a1"),
|
||||||
@ -174,7 +174,7 @@ fn test_default_enum() {
|
|||||||
assert_de_tokens(
|
assert_de_tokens(
|
||||||
&DefaultEnum::Struct { a1: 1, a2: 0, a3: 123, a4: 0, a5: 123 },
|
&DefaultEnum::Struct { a1: 1, a2: 0, a3: 123, a4: 0, a5: 123 },
|
||||||
&[
|
&[
|
||||||
Token::EnumMapStart("DefaultEnum", "Struct", 5),
|
Token::EnumMapStart("DefaultEnum", "Struct", 3),
|
||||||
|
|
||||||
Token::EnumMapSep,
|
Token::EnumMapSep,
|
||||||
Token::Str("a1"),
|
Token::Str("a1"),
|
||||||
|
Loading…
x
Reference in New Issue
Block a user