diff --git a/serde/src/private/de.rs b/serde/src/private/de.rs index f0eca71ff..34a2d50c4 100644 --- a/serde/src/private/de.rs +++ b/serde/src/private/de.rs @@ -476,14 +476,16 @@ mod content { where D: Deserializer<'de>, { - Deserialize::deserialize(deserializer).map(|v| Content::Some(Box::new(v))) + let v = tri!(Deserialize::deserialize(deserializer)); + Ok(Content::Some(Box::new(v))) } fn visit_newtype_struct(self, deserializer: D) -> Result where D: Deserializer<'de>, { - Deserialize::deserialize(deserializer).map(|v| Content::Newtype(Box::new(v))) + let v = tri!(Deserialize::deserialize(deserializer)); + Ok(Content::Newtype(Box::new(v))) } fn visit_seq(self, mut visitor: V) -> Result @@ -1113,9 +1115,13 @@ mod content { V: Visitor<'de>, E: de::Error, { - let map = content - .into_iter() - .map(|(k, v)| (ContentDeserializer::new(k), ContentDeserializer::new(v))); + fn content_deserializer_pair<'de, E>( + (k, v): (Content<'de>, Content<'de>), + ) -> (ContentDeserializer<'de, E>, ContentDeserializer<'de, E>) { + (ContentDeserializer::new(k), ContentDeserializer::new(v)) + } + + let map = content.into_iter().map(content_deserializer_pair); let mut map_visitor = MapDeserializer::new(map); let value = tri!(visitor.visit_map(&mut map_visitor)); tri!(map_visitor.end()); @@ -1709,12 +1715,19 @@ mod content { V: Visitor<'de>, E: de::Error, { - let map = content.iter().map(|(k, v)| { + fn content_ref_deserializer_pair<'a, 'de, E>( + (k, v): &'a (Content<'de>, Content<'de>), + ) -> ( + ContentRefDeserializer<'a, 'de, E>, + ContentRefDeserializer<'a, 'de, E>, + ) { ( ContentRefDeserializer::new(k), ContentRefDeserializer::new(v), ) - }); + } + + let map = content.iter().map(content_ref_deserializer_pair); let mut map_visitor = MapDeserializer::new(map); let value = tri!(visitor.visit_map(&mut map_visitor)); tri!(map_visitor.end());