Skip to content

Commit

Permalink
Get rid of repeated code
Browse files Browse the repository at this point in the history
  • Loading branch information
Mingun committed Feb 27, 2021
1 parent 5106111 commit a169bee
Showing 1 changed file with 16 additions and 17 deletions.
33 changes: 16 additions & 17 deletions serde_derive/src/de.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1422,7 +1422,7 @@ fn deserialize_internally_tagged_enum(
_ => None,
}
});
let variant_arms: Vec<_> = variants
let variant_arms = variants
.map(|(i, variant)| {
let variant_name = field_i(i);

Expand All @@ -1437,8 +1437,7 @@ fn deserialize_internally_tagged_enum(
quote! {
#field_struct_name::#variant_name => #block
}
})
.collect();
});

let expecting = format!("internally tagged enum {}", params.type_name());
let expecting = cattrs.expecting().unwrap_or(&expecting);
Expand All @@ -1460,6 +1459,17 @@ fn deserialize_internally_tagged_enum(
lifetime: _serde::__private::PhantomData<&#delife ()>,
}

impl #de_impl_generics __Visitor #de_ty_generics #where_clause {
fn visit<__D>(__tag: #field_struct_name, __deserializer: __D) -> _serde::__private::Result<#this #ty_generics, __D::Error>
where
__D: _serde::de::Deserializer<#delife>,
{
match __tag {
#(#variant_arms)*
}
}
}

impl #de_impl_generics _serde::de::Visitor<#delife> for __Visitor #de_ty_generics #where_clause {
type Value = #this #ty_generics;

Expand All @@ -1473,11 +1483,7 @@ fn deserialize_internally_tagged_enum(
{
match try!(_serde::de::SeqAccess::next_element(&mut __seq)) {
_serde::__private::Some(__tag) => {
let __deserializer = _serde::de::value::SeqAccessDeserializer::new(__seq);

match __tag {
#(#variant_arms)*
}
Self::visit(__tag, _serde::de::value::SeqAccessDeserializer::new(__seq))
},
_serde::__private::None => _serde::__private::Err(_serde::de::Error::missing_field(#tag)),
}
Expand All @@ -1495,22 +1501,15 @@ fn deserialize_internally_tagged_enum(
)) {
_serde::__private::Some(_serde::__private::de::TagOrContent::Tag) => {
let __tag = try!(_serde::de::MapAccess::next_value(&mut __map));
let __deserializer = _serde::de::value::MapAccessDeserializer::new(__map);

match __tag {
#(#variant_arms)*
}
Self::visit(__tag, _serde::de::value::MapAccessDeserializer::new(__map))
},
_serde::__private::Some(_serde::__private::de::TagOrContent::Content(__key)) => {
// Drain map to Content::Map, convert it to ContentDeserializer
// Special handling for tag key -- search them and return as separate result
let (__tag, __deserializer) = try!(_serde::__private::de::drain_map(
__map, #tag, __key
));

match __tag {
#(#variant_arms)*
}
Self::visit(__tag, __deserializer)
},
_serde::__private::None => _serde::__private::Err(_serde::de::Error::missing_field(#tag)),
}
Expand Down

0 comments on commit a169bee

Please sign in to comment.