From a169beee0d84fa0cad022357c974d05c223e32a0 Mon Sep 17 00:00:00 2001 From: Mingun Date: Sat, 27 Feb 2021 19:55:00 +0500 Subject: [PATCH] Get rid of repeated code --- serde_derive/src/de.rs | 33 ++++++++++++++++----------------- 1 file changed, 16 insertions(+), 17 deletions(-) diff --git a/serde_derive/src/de.rs b/serde_derive/src/de.rs index f73d99996..c04620bb4 100644 --- a/serde_derive/src/de.rs +++ b/serde_derive/src/de.rs @@ -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); @@ -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); @@ -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; @@ -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)), } @@ -1495,11 +1501,7 @@ 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 @@ -1507,10 +1509,7 @@ fn deserialize_internally_tagged_enum( 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)), }