Skip to content

Commit 427c839

Browse files
authored
Merge pull request #2448 from Mingun/ser-flatten-enums
Implement serialization of tuple variants of flatten enums
2 parents 48aa054 + 4e5e55b commit 427c839

File tree

4 files changed

+428
-490
lines changed

4 files changed

+428
-490
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)

serde/src/private/ser.rs

+50-3
Original file line numberDiff line numberDiff line change
@@ -1025,7 +1025,7 @@ where
10251025
type SerializeTupleStruct = Impossible<Self::Ok, M::Error>;
10261026
type SerializeMap = FlatMapSerializeMap<'a, M>;
10271027
type SerializeStruct = FlatMapSerializeStruct<'a, M>;
1028-
type SerializeTupleVariant = Impossible<Self::Ok, M::Error>;
1028+
type SerializeTupleVariant = FlatMapSerializeTupleVariantAsMapValue<'a, M>;
10291029
type SerializeStructVariant = FlatMapSerializeStructVariantAsMapValue<'a, M>;
10301030

10311031
fn serialize_bool(self, _: bool) -> Result<Self::Ok, Self::Error> {
@@ -1157,10 +1157,11 @@ where
11571157
self,
11581158
_: &'static str,
11591159
_: u32,
1160-
_: &'static str,
1160+
variant: &'static str,
11611161
_: usize,
11621162
) -> Result<Self::SerializeTupleVariant, Self::Error> {
1163-
Err(Self::bad_type(Unsupported::Enum))
1163+
try!(self.0.serialize_key(variant));
1164+
Ok(FlatMapSerializeTupleVariantAsMapValue::new(self.0))
11641165
}
11651166

11661167
fn serialize_map(self, _: Option<usize>) -> Result<Self::SerializeMap, Self::Error> {
@@ -1259,6 +1260,52 @@ where
12591260
}
12601261
}
12611262

1263+
////////////////////////////////////////////////////////////////////////////////////////////////////
1264+
1265+
#[cfg(any(feature = "std", feature = "alloc"))]
1266+
pub struct FlatMapSerializeTupleVariantAsMapValue<'a, M: 'a> {
1267+
map: &'a mut M,
1268+
fields: Vec<Content>,
1269+
}
1270+
1271+
#[cfg(any(feature = "std", feature = "alloc"))]
1272+
impl<'a, M> FlatMapSerializeTupleVariantAsMapValue<'a, M>
1273+
where
1274+
M: SerializeMap + 'a,
1275+
{
1276+
fn new(map: &'a mut M) -> Self {
1277+
FlatMapSerializeTupleVariantAsMapValue {
1278+
map: map,
1279+
fields: Vec::new(),
1280+
}
1281+
}
1282+
}
1283+
1284+
#[cfg(any(feature = "std", feature = "alloc"))]
1285+
impl<'a, M> ser::SerializeTupleVariant for FlatMapSerializeTupleVariantAsMapValue<'a, M>
1286+
where
1287+
M: SerializeMap + 'a,
1288+
{
1289+
type Ok = ();
1290+
type Error = M::Error;
1291+
1292+
fn serialize_field<T: ?Sized>(&mut self, value: &T) -> Result<(), Self::Error>
1293+
where
1294+
T: Serialize,
1295+
{
1296+
let value = try!(value.serialize(ContentSerializer::<M::Error>::new()));
1297+
self.fields.push(value);
1298+
Ok(())
1299+
}
1300+
1301+
fn end(self) -> Result<(), Self::Error> {
1302+
try!(self.map.serialize_value(&Content::Seq(self.fields)));
1303+
Ok(())
1304+
}
1305+
}
1306+
1307+
////////////////////////////////////////////////////////////////////////////////////////////////////
1308+
12621309
#[cfg(any(feature = "std", feature = "alloc"))]
12631310
pub struct FlatMapSerializeStructVariantAsMapValue<'a, M: 'a> {
12641311
map: &'a mut M,

0 commit comments

Comments
 (0)