Pull up call to deserialize_map because it's identical

This commit is contained in:
Mingun
2020-10-01 13:29:39 +05:00
committed by Mingun
parent 95730dc7f7
commit 2796833c82
+8 -16
View File
@@ -940,14 +940,13 @@ fn deserialize_struct(
}; };
let expecting = cattrs.expecting().unwrap_or(&expecting); let expecting = cattrs.expecting().unwrap_or(&expecting);
let (field_visitor, fields_stmt, visit_map) = if cattrs.has_flatten() { let (field_visitor, fields_stmt) = if cattrs.has_flatten() {
deserialize_struct_as_map_visitor(&type_path, params, fields, cattrs) deserialize_struct_as_map_visitor(fields, cattrs)
} else { } else {
deserialize_struct_as_struct_visitor(&type_path, params, fields, cattrs) deserialize_struct_as_struct_visitor(fields, cattrs)
}; };
let field_visitor = Stmts(field_visitor); let field_visitor = Stmts(field_visitor);
let fields_stmt = fields_stmt.map(Stmts); let fields_stmt = fields_stmt.map(Stmts);
let visit_map = Stmts(visit_map);
// untagged struct variants do not get a visit_seq method. The same applies to // untagged struct variants do not get a visit_seq method. The same applies to
// structs that only have a map representation. // structs that only have a map representation.
@@ -976,6 +975,7 @@ fn deserialize_struct(
} }
_ => None, _ => None,
}; };
let visit_map = Stmts(deserialize_map(&type_path, params, fields, cattrs));
let is_enum = variant_ident.is_some(); let is_enum = variant_ident.is_some();
let need_seed = deserializer.is_none(); let need_seed = deserializer.is_none();
@@ -2425,11 +2425,9 @@ fn deserialize_identifier(
} }
fn deserialize_struct_as_struct_visitor( fn deserialize_struct_as_struct_visitor(
struct_path: &TokenStream,
params: &Parameters,
fields: &[Field], fields: &[Field],
cattrs: &attr::Container, cattrs: &attr::Container,
) -> (Fragment, Option<Fragment>, Fragment) { ) -> (Fragment, Option<Fragment>) {
assert!(!cattrs.has_flatten()); assert!(!cattrs.has_flatten());
let field_names_idents: Vec<_> = fields let field_names_idents: Vec<_> = fields
@@ -2458,17 +2456,13 @@ fn deserialize_struct_as_struct_visitor(
let field_visitor = deserialize_generated_identifier(&field_names_idents, cattrs, false, None); let field_visitor = deserialize_generated_identifier(&field_names_idents, cattrs, false, None);
let visit_map = deserialize_map(struct_path, params, fields, cattrs); (field_visitor, Some(fields_stmt))
(field_visitor, Some(fields_stmt), visit_map)
} }
fn deserialize_struct_as_map_visitor( fn deserialize_struct_as_map_visitor(
struct_path: &TokenStream,
params: &Parameters,
fields: &[Field], fields: &[Field],
cattrs: &attr::Container, cattrs: &attr::Container,
) -> (Fragment, Option<Fragment>, Fragment) { ) -> (Fragment, Option<Fragment>) {
let field_names_idents: Vec<_> = fields let field_names_idents: Vec<_> = fields
.iter() .iter()
.enumerate() .enumerate()
@@ -2484,9 +2478,7 @@ fn deserialize_struct_as_map_visitor(
let field_visitor = deserialize_generated_identifier(&field_names_idents, cattrs, false, None); let field_visitor = deserialize_generated_identifier(&field_names_idents, cattrs, false, None);
let visit_map = deserialize_map(struct_path, params, fields, cattrs); (field_visitor, None)
(field_visitor, None, visit_map)
} }
fn deserialize_map( fn deserialize_map(