Skip to content

Commit 7bde100

Browse files
committed
Replace MapRefDeserializer with value::MapDeserializer
Although they are slightly different, this difference is irrelevant: - MapDeserializer has a specialization for deserialize_seq and deserialize_tuple, but only MapRefDeserializer::deserialize_any is used by the code which is almost the same - MapDeserializer checks that map was consumed after visit_map, but MapRefDeserializer does not. Actually, each derived implementation consumes map and each manual implementation also should consume it Also, MapDeserializer already used when value deserialized from ContentRefDeserializer directly and MapRefDeserializer was only used to deserialize Struct variants of enums. There are no reasons why the behavior should be different in those two cases
1 parent da7fc79 commit 7bde100

File tree

1 file changed

+1
-80
lines changed

1 file changed

+1
-80
lines changed

serde/src/private/de.rs

Lines changed: 1 addition & 80 deletions
Original file line numberDiff line numberDiff line change
@@ -2213,9 +2213,7 @@ mod content {
22132213
match self.value {
22142214
// Covered by tests/test_enum_untagged.rs
22152215
// newtype_enum::struct_from_map
2216-
Some(Content::Map(v)) => {
2217-
de::Deserializer::deserialize_any(MapRefDeserializer::new(v), visitor)
2218-
}
2216+
Some(Content::Map(v)) => visit_content_map_ref(v, visitor),
22192217
// Covered by tests/test_enum_untagged.rs
22202218
// newtype_enum::struct_from_seq
22212219
// newtype_enum::empty_struct_from_seq
@@ -2232,83 +2230,6 @@ mod content {
22322230
}
22332231
}
22342232

2235-
struct MapRefDeserializer<'a, 'de: 'a, E>
2236-
where
2237-
E: de::Error,
2238-
{
2239-
iter: <&'a [(Content<'de>, Content<'de>)] as IntoIterator>::IntoIter,
2240-
value: Option<&'a Content<'de>>,
2241-
err: PhantomData<E>,
2242-
}
2243-
2244-
impl<'a, 'de, E> MapRefDeserializer<'a, 'de, E>
2245-
where
2246-
E: de::Error,
2247-
{
2248-
fn new(map: &'a [(Content<'de>, Content<'de>)]) -> Self {
2249-
MapRefDeserializer {
2250-
iter: map.iter(),
2251-
value: None,
2252-
err: PhantomData,
2253-
}
2254-
}
2255-
}
2256-
2257-
impl<'de, 'a, E> de::MapAccess<'de> for MapRefDeserializer<'a, 'de, E>
2258-
where
2259-
E: de::Error,
2260-
{
2261-
type Error = E;
2262-
2263-
fn next_key_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>, Self::Error>
2264-
where
2265-
T: de::DeserializeSeed<'de>,
2266-
{
2267-
match self.iter.next() {
2268-
Some((key, value)) => {
2269-
self.value = Some(value);
2270-
seed.deserialize(ContentRefDeserializer::new(key)).map(Some)
2271-
}
2272-
None => Ok(None),
2273-
}
2274-
}
2275-
2276-
fn next_value_seed<T>(&mut self, seed: T) -> Result<T::Value, Self::Error>
2277-
where
2278-
T: de::DeserializeSeed<'de>,
2279-
{
2280-
match self.value.take() {
2281-
Some(value) => seed.deserialize(ContentRefDeserializer::new(value)),
2282-
None => Err(de::Error::custom("value is missing")),
2283-
}
2284-
}
2285-
2286-
fn size_hint(&self) -> Option<usize> {
2287-
size_hint::from_bounds(&self.iter)
2288-
}
2289-
}
2290-
2291-
impl<'de, 'a, E> de::Deserializer<'de> for MapRefDeserializer<'a, 'de, E>
2292-
where
2293-
E: de::Error,
2294-
{
2295-
type Error = E;
2296-
2297-
#[inline]
2298-
fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Self::Error>
2299-
where
2300-
V: de::Visitor<'de>,
2301-
{
2302-
visitor.visit_map(self)
2303-
}
2304-
2305-
forward_to_deserialize_any! {
2306-
bool i8 i16 i32 i64 i128 u8 u16 u32 u64 u128 f32 f64 char str string
2307-
bytes byte_buf option unit unit_struct newtype_struct seq tuple
2308-
tuple_struct map struct enum identifier ignored_any
2309-
}
2310-
}
2311-
23122233
impl<'de, E> de::IntoDeserializer<'de, E> for ContentDeserializer<'de, E>
23132234
where
23142235
E: de::Error,

0 commit comments

Comments
 (0)