Merge pull request #468 from sfackler/split-map

Split serialize_map_elt
This commit is contained in:
David Tolnay 2016-07-27 12:50:42 -07:00 committed by GitHub
commit d02e959b3f
4 changed files with 27 additions and 11 deletions

View File

@ -522,7 +522,8 @@ macro_rules! serialize_map {
{
let mut state = try!(serializer.serialize_map(Some(self.len())));
for (k, v) in self {
try!(serializer.serialize_map_elt(&mut state, k, v));
try!(serializer.serialize_map_key(&mut state, k));
try!(serializer.serialize_map_value(&mut state, v));
}
serializer.serialize_map_end(state)
}

View File

@ -334,18 +334,25 @@ pub trait Serializer {
) -> Result<(), Self::Error>;
/// Begins to serialize a map. This call must be followed by zero or more
/// calls to `serialize_map_elt`, then a call to `serialize_map_end`.
/// calls to `serialize_map_key` and `serialize_map_value`, then a call to
/// `serialize_map_end`.
fn serialize_map(
&mut self,
len: Option<usize>,
) -> Result<Self::MapState, Self::Error>;
/// Serialize a map element. Must have previously called `serialize_map`.
fn serialize_map_elt<K: Serialize, V: Serialize>(
/// Serialize a map key. Must have previously called `serialize_map`.
fn serialize_map_key<T: Serialize>(
&mut self,
state: &mut Self::MapState,
key: K,
value: V,
key: T
) -> Result<(), Self::Error>;
/// Serialize a map value. Must have previously called `serialize_map`.
fn serialize_map_value<T: Serialize>(
&mut self,
state: &mut Self::MapState,
value: T
) -> Result<(), Self::Error>;
/// Finishes serializing a map.

View File

@ -259,9 +259,12 @@ impl<'a, I> ser::Serializer for Serializer<'a, I>
Ok(())
}
fn serialize_map_elt<K, V>(&mut self, _: &mut (), key: K, value: V) -> Result<(), Self::Error> where K: Serialize, V: Serialize {
fn serialize_map_key<T>(&mut self, _: &mut (), key: T) -> Result<(), Self::Error> where T: Serialize {
assert_eq!(self.tokens.next(), Some(&Token::MapSep));
try!(key.serialize(self));
key.serialize(self)
}
fn serialize_map_value<T>(&mut self, _: &mut (), value: T) -> Result<(), Self::Error> where T: Serialize {
value.serialize(self)
}

View File

@ -229,9 +229,14 @@ impl Serializer for BytesSerializer {
Err(Error)
}
fn serialize_map_elt<K, V>(&mut self, _: &mut (), _key: K, _value: V) -> Result<(), Error>
where K: Serialize,
V: Serialize,
fn serialize_map_key<T>(&mut self, _: &mut (), _key: T) -> Result<(), Error>
where T: Serialize
{
Err(Error)
}
fn serialize_map_value<T>(&mut self, _: &mut (), _value: T) -> Result<(), Error>
where T: Serialize
{
Err(Error)
}