Skip to content

Commit

Permalink
Move generiс code out-of-function, create more specialized and simple…
Browse files Browse the repository at this point in the history
… code
  • Loading branch information
Mingun committed Aug 6, 2023
1 parent 2a36d11 commit 5e313a7
Showing 1 changed file with 26 additions and 19 deletions.
45 changes: 26 additions & 19 deletions serde_derive/src/de.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1247,11 +1247,20 @@ fn prepare_enum_variant_enum(
}
};

let (ignore_variant, fallthrough) = if let Some(other_idx) = other_idx {
let ignore_variant = variant_names_idents[other_idx].1.clone();
let fallthrough = quote!(_serde::__private::Ok(__Field::#ignore_variant));
(None, Some(fallthrough))
} else {
(None, None)
};

let variant_visitor = Stmts(deserialize_generated_identifier(
&variant_names_idents,
cattrs,
true,
other_idx,
ignore_variant,
fallthrough,
));

(variants_stmt, variant_visitor)
Expand Down Expand Up @@ -1976,27 +1985,12 @@ fn deserialize_generated_identifier(
fields: &[(&str, Ident, &BTreeSet<String>)],
cattrs: &attr::Container,
is_variant: bool,
other_idx: Option<usize>,
ignore_variant: Option<TokenStream>,
fallthrough: Option<TokenStream>,
) -> Fragment {
let this_value = quote!(__Field);
let field_idents: &Vec<_> = &fields.iter().map(|(_, ident, _)| ident).collect();

let (ignore_variant, fallthrough) = if !is_variant && cattrs.has_flatten() {
let ignore_variant = quote!(__other(_serde::__private::de::Content<'de>),);
let fallthrough = quote!(_serde::__private::Ok(__Field::__other(__value)));
(Some(ignore_variant), Some(fallthrough))
} else if let Some(other_idx) = other_idx {
let ignore_variant = fields[other_idx].1.clone();
let fallthrough = quote!(_serde::__private::Ok(__Field::#ignore_variant));
(None, Some(fallthrough))
} else if is_variant || cattrs.deny_unknown_fields() {
(None, None)
} else {
let ignore_variant = quote!(__ignore,);
let fallthrough = quote!(_serde::__private::Ok(__Field::__ignore));
(Some(ignore_variant), Some(fallthrough))
};

let visitor_impl = Stmts(deserialize_identifier(
&this_value,
fields,
Expand Down Expand Up @@ -2048,11 +2042,24 @@ fn deserialize_field_identifier(
fields: &[(&str, Ident, &BTreeSet<String>)],
cattrs: &attr::Container,
) -> Stmts {
let (ignore_variant, fallthrough) = if cattrs.has_flatten() {
let ignore_variant = quote!(__other(_serde::__private::de::Content<'de>),);
let fallthrough = quote!(_serde::__private::Ok(__Field::__other(__value)));
(Some(ignore_variant), Some(fallthrough))
} else if cattrs.deny_unknown_fields() {
(None, None)
} else {
let ignore_variant = quote!(__ignore,);
let fallthrough = quote!(_serde::__private::Ok(__Field::__ignore));
(Some(ignore_variant), Some(fallthrough))
};

Stmts(deserialize_generated_identifier(
fields,
cattrs,
false,
None,
ignore_variant,
fallthrough,
))
}

Expand Down

0 comments on commit 5e313a7

Please sign in to comment.