Skip to content

Commit 4e5e55b

Browse files
committed
Remove custom implementations of SeqDeserializer and MapDeserializer for enums
Those deserializers are used to deserialize tuple or struct variants from Content which is used by internally tagged enums and by flatten FlatMapDeserializer is reached in the following tests: flatten::enum_::externally_tagged::newtype flatten::enum_::externally_tagged::struct_from_map flatten::enum_::externally_tagged::struct_from_seq flatten::enum_::externally_tagged::tuple ContentDeserializer is reached in the following tests: test_enum_in_internally_tagged_enum test_internally_tagged_struct_variant_containing_unit_variant
1 parent 4513a9e commit 4e5e55b

File tree

1 file changed

+19
-157
lines changed

1 file changed

+19
-157
lines changed

serde/src/private/de.rs

+19-157
Original file line numberDiff line numberDiff line change
@@ -207,6 +207,7 @@ mod content {
207207

208208
use __private::size_hint;
209209
use actually_private;
210+
use de::value::{MapDeserializer, SeqDeserializer};
210211
use de::{
211212
self, Deserialize, DeserializeSeed, Deserializer, EnumAccess, Expected, IgnoredAny,
212213
MapAccess, SeqAccess, Unexpected, Visitor,
@@ -299,6 +300,17 @@ mod content {
299300
}
300301
}
301302

303+
impl<'de, E> de::IntoDeserializer<'de, E> for Content<'de>
304+
where
305+
E: de::Error,
306+
{
307+
type Deserializer = ContentDeserializer<'de, E>;
308+
309+
fn into_deserializer(self) -> Self::Deserializer {
310+
ContentDeserializer::new(self)
311+
}
312+
}
313+
302314
struct ContentVisitor<'de> {
303315
value: PhantomData<Content<'de>>,
304316
}
@@ -1074,7 +1086,7 @@ mod content {
10741086
E: de::Error,
10751087
{
10761088
let seq = content.into_iter().map(ContentDeserializer::new);
1077-
let mut seq_visitor = de::value::SeqDeserializer::new(seq);
1089+
let mut seq_visitor = SeqDeserializer::new(seq);
10781090
let value = try!(visitor.visit_seq(&mut seq_visitor));
10791091
try!(seq_visitor.end());
10801092
Ok(value)
@@ -1091,7 +1103,7 @@ mod content {
10911103
let map = content
10921104
.into_iter()
10931105
.map(|(k, v)| (ContentDeserializer::new(k), ContentDeserializer::new(v)));
1094-
let mut map_visitor = de::value::MapDeserializer::new(map);
1106+
let mut map_visitor = MapDeserializer::new(map);
10951107
let value = try!(visitor.visit_map(&mut map_visitor));
10961108
try!(map_visitor.end());
10971109
Ok(value)
@@ -1569,7 +1581,7 @@ mod content {
15691581
{
15701582
match self.value {
15711583
Some(Content::Seq(v)) => {
1572-
de::Deserializer::deserialize_any(SeqDeserializer::new(v), visitor)
1584+
de::Deserializer::deserialize_any(SeqDeserializer::new(v.into_iter()), visitor)
15731585
}
15741586
Some(other) => Err(de::Error::invalid_type(
15751587
other.unexpected(),
@@ -1592,10 +1604,10 @@ mod content {
15921604
{
15931605
match self.value {
15941606
Some(Content::Map(v)) => {
1595-
de::Deserializer::deserialize_any(MapDeserializer::new(v), visitor)
1607+
de::Deserializer::deserialize_any(MapDeserializer::new(v.into_iter()), visitor)
15961608
}
15971609
Some(Content::Seq(v)) => {
1598-
de::Deserializer::deserialize_any(SeqDeserializer::new(v), visitor)
1610+
de::Deserializer::deserialize_any(SeqDeserializer::new(v.into_iter()), visitor)
15991611
}
16001612
Some(other) => Err(de::Error::invalid_type(
16011613
other.unexpected(),
@@ -1609,156 +1621,6 @@ mod content {
16091621
}
16101622
}
16111623

1612-
struct SeqDeserializer<'de, E>
1613-
where
1614-
E: de::Error,
1615-
{
1616-
iter: <Vec<Content<'de>> as IntoIterator>::IntoIter,
1617-
err: PhantomData<E>,
1618-
}
1619-
1620-
impl<'de, E> SeqDeserializer<'de, E>
1621-
where
1622-
E: de::Error,
1623-
{
1624-
fn new(vec: Vec<Content<'de>>) -> Self {
1625-
SeqDeserializer {
1626-
iter: vec.into_iter(),
1627-
err: PhantomData,
1628-
}
1629-
}
1630-
}
1631-
1632-
impl<'de, E> de::Deserializer<'de> for SeqDeserializer<'de, E>
1633-
where
1634-
E: de::Error,
1635-
{
1636-
type Error = E;
1637-
1638-
#[inline]
1639-
fn deserialize_any<V>(mut self, visitor: V) -> Result<V::Value, Self::Error>
1640-
where
1641-
V: de::Visitor<'de>,
1642-
{
1643-
let len = self.iter.len();
1644-
if len == 0 {
1645-
visitor.visit_unit()
1646-
} else {
1647-
let ret = try!(visitor.visit_seq(&mut self));
1648-
let remaining = self.iter.len();
1649-
if remaining == 0 {
1650-
Ok(ret)
1651-
} else {
1652-
Err(de::Error::invalid_length(len, &"fewer elements in array"))
1653-
}
1654-
}
1655-
}
1656-
1657-
forward_to_deserialize_any! {
1658-
bool i8 i16 i32 i64 i128 u8 u16 u32 u64 u128 f32 f64 char str string
1659-
bytes byte_buf option unit unit_struct newtype_struct seq tuple
1660-
tuple_struct map struct enum identifier ignored_any
1661-
}
1662-
}
1663-
1664-
impl<'de, E> de::SeqAccess<'de> for SeqDeserializer<'de, E>
1665-
where
1666-
E: de::Error,
1667-
{
1668-
type Error = E;
1669-
1670-
fn next_element_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>, Self::Error>
1671-
where
1672-
T: de::DeserializeSeed<'de>,
1673-
{
1674-
match self.iter.next() {
1675-
Some(value) => seed.deserialize(ContentDeserializer::new(value)).map(Some),
1676-
None => Ok(None),
1677-
}
1678-
}
1679-
1680-
fn size_hint(&self) -> Option<usize> {
1681-
size_hint::from_bounds(&self.iter)
1682-
}
1683-
}
1684-
1685-
struct MapDeserializer<'de, E>
1686-
where
1687-
E: de::Error,
1688-
{
1689-
iter: <Vec<(Content<'de>, Content<'de>)> as IntoIterator>::IntoIter,
1690-
value: Option<Content<'de>>,
1691-
err: PhantomData<E>,
1692-
}
1693-
1694-
impl<'de, E> MapDeserializer<'de, E>
1695-
where
1696-
E: de::Error,
1697-
{
1698-
fn new(map: Vec<(Content<'de>, Content<'de>)>) -> Self {
1699-
MapDeserializer {
1700-
iter: map.into_iter(),
1701-
value: None,
1702-
err: PhantomData,
1703-
}
1704-
}
1705-
}
1706-
1707-
impl<'de, E> de::MapAccess<'de> for MapDeserializer<'de, E>
1708-
where
1709-
E: de::Error,
1710-
{
1711-
type Error = E;
1712-
1713-
fn next_key_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>, Self::Error>
1714-
where
1715-
T: de::DeserializeSeed<'de>,
1716-
{
1717-
match self.iter.next() {
1718-
Some((key, value)) => {
1719-
self.value = Some(value);
1720-
seed.deserialize(ContentDeserializer::new(key)).map(Some)
1721-
}
1722-
None => Ok(None),
1723-
}
1724-
}
1725-
1726-
fn next_value_seed<T>(&mut self, seed: T) -> Result<T::Value, Self::Error>
1727-
where
1728-
T: de::DeserializeSeed<'de>,
1729-
{
1730-
match self.value.take() {
1731-
Some(value) => seed.deserialize(ContentDeserializer::new(value)),
1732-
None => Err(de::Error::custom("value is missing")),
1733-
}
1734-
}
1735-
1736-
fn size_hint(&self) -> Option<usize> {
1737-
size_hint::from_bounds(&self.iter)
1738-
}
1739-
}
1740-
1741-
impl<'de, E> de::Deserializer<'de> for MapDeserializer<'de, E>
1742-
where
1743-
E: de::Error,
1744-
{
1745-
type Error = E;
1746-
1747-
#[inline]
1748-
fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Self::Error>
1749-
where
1750-
V: de::Visitor<'de>,
1751-
{
1752-
visitor.visit_map(self)
1753-
}
1754-
1755-
forward_to_deserialize_any! {
1756-
bool i8 i16 i32 i64 i128 u8 u16 u32 u64 u128 f32 f64 char str string
1757-
bytes byte_buf option unit unit_struct newtype_struct seq tuple
1758-
tuple_struct map struct enum identifier ignored_any
1759-
}
1760-
}
1761-
17621624
/// Not public API.
17631625
pub struct ContentRefDeserializer<'a, 'de: 'a, E> {
17641626
content: &'a Content<'de>,
@@ -1820,7 +1682,7 @@ mod content {
18201682
E: de::Error,
18211683
{
18221684
let seq = content.iter().map(ContentRefDeserializer::new);
1823-
let mut seq_visitor = de::value::SeqDeserializer::new(seq);
1685+
let mut seq_visitor = SeqDeserializer::new(seq);
18241686
let value = try!(visitor.visit_seq(&mut seq_visitor));
18251687
try!(seq_visitor.end());
18261688
Ok(value)
@@ -1840,7 +1702,7 @@ mod content {
18401702
ContentRefDeserializer::new(v),
18411703
)
18421704
});
1843-
let mut map_visitor = de::value::MapDeserializer::new(map);
1705+
let mut map_visitor = MapDeserializer::new(map);
18441706
let value = try!(visitor.visit_map(&mut map_visitor));
18451707
try!(map_visitor.end());
18461708
Ok(value)

0 commit comments

Comments
 (0)