Use opaque structs instead of opaque tuples

Opaque struct tuples leak their arity.
This commit is contained in:
Anthony Ramine 2016-10-23 11:55:16 +02:00
parent 7e09a773cd
commit 39f7d33b0b
2 changed files with 41 additions and 24 deletions

View File

@ -55,13 +55,15 @@ pub fn from_str<T: de::Deserialize>(input: &str) -> Result<T, Error> {
///
/// * Everything else but `deserialize_seq` and `deserialize_seq_fixed_size`
/// defers to `deserialize`.
pub struct Deserializer<'a>(
MapDeserializer<UrlEncodedParse<'a>, Cow<'a, str>, Cow<'a, str>, Error>);
pub struct Deserializer<'a> {
inner:
MapDeserializer<UrlEncodedParse<'a>, Cow<'a, str>, Cow<'a, str>, Error>,
}
impl<'a> Deserializer<'a> {
/// Returns a new `Deserializer`.
pub fn new(parser: UrlEncodedParse<'a>) -> Self {
Deserializer(MapDeserializer::unbounded(parser))
Deserializer { inner: MapDeserializer::unbounded(parser) }
}
}
@ -82,7 +84,7 @@ impl<'a> de::Deserializer for Deserializer<'a>
-> Result<V::Value, Self::Error>
where V: de::Visitor,
{
visitor.visit_map(&mut self.0)
visitor.visit_map(&mut self.inner)
}
fn deserialize_seq<V>(
@ -90,7 +92,7 @@ impl<'a> de::Deserializer for Deserializer<'a>
-> Result<V::Value, Self::Error>
where V: de::Visitor,
{
visitor.visit_seq(&mut self.0)
visitor.visit_seq(&mut self.inner)
}
fn deserialize_seq_fixed_size<V>(
@ -98,7 +100,7 @@ impl<'a> de::Deserializer for Deserializer<'a>
-> Result<V::Value, Self::Error>
where V: de::Visitor
{
visitor.visit_seq(&mut self.0)
visitor.visit_seq(&mut self.inner)
}
forward_to_deserialize! {

View File

@ -44,13 +44,14 @@ pub fn to_string<T: ser::Serialize>(input: &T) -> Result<String, Error> {
/// unit structs and unit variants.
///
/// * Newtype structs defer to their inner values.
pub struct Serializer<'output, T: 'output>(&'output mut UrlEncodedSerializer<T>)
where T: UrlEncodedTarget;
pub struct Serializer<'output, T: 'output + UrlEncodedTarget> {
urlencoder: &'output mut UrlEncodedSerializer<T>
}
impl<'output, T: 'output + UrlEncodedTarget> Serializer<'output, T> {
/// Returns a new `Serializer`.
pub fn new(urlencoder: &'output mut UrlEncodedSerializer<T>) -> Self {
Serializer(urlencoder)
Serializer { urlencoder: urlencoder }
}
}
@ -101,25 +102,39 @@ impl ser::Error for Error {
}
/// State used when serializing sequences.
pub struct SeqState(());
pub struct SeqState {
_state: (),
}
/// State used when serializing tuples.
pub struct TupleState(());
pub struct TupleState {
_state: (),
}
/// State used when serializing tuple structs.
pub struct TupleStructState(());
pub struct TupleStructState {
_state: (),
}
/// State used when serializing tuple variants.
pub struct TupleVariantState(());
pub struct TupleVariantState {
_state: (),
}
/// State used when serializing maps.
pub struct MapState(Option<Cow<'static, str>>);
pub struct MapState {
key: Option<Cow<'static, str>>
}
/// State used when serializing structs.
pub struct StructState(());
pub struct StructState {
_state: (),
}
/// State used when serializing struct variants.
pub struct StructVariantState(());
pub struct StructVariantState {
_state: (),
}
impl<'output, Target> ser::Serializer for Serializer<'output, Target>
where Target: 'output + UrlEncodedTarget
@ -287,7 +302,7 @@ impl<'output, Target> ser::Serializer for Serializer<'output, Target>
fn serialize_seq(
&mut self, _len: Option<usize>)
-> Result<SeqState, Error> {
Ok(SeqState(()))
Ok(SeqState { _state: () })
}
/// Serializes a sequence element.
@ -296,7 +311,7 @@ impl<'output, Target> ser::Serializer for Serializer<'output, Target>
-> Result<(), Error>
where T: ser::Serialize
{
value.serialize(&mut pair::PairSerializer::new(self.0))
value.serialize(&mut pair::PairSerializer::new(self.urlencoder))
}
/// Finishes serializing a sequence.
@ -308,7 +323,7 @@ impl<'output, Target> ser::Serializer for Serializer<'output, Target>
fn serialize_seq_fixed_size(
&mut self, _length: usize)
-> Result<SeqState, Error> {
Ok(SeqState(()))
Ok(SeqState { _state: () })
}
/// Returns an error.
@ -385,7 +400,7 @@ impl<'output, Target> ser::Serializer for Serializer<'output, Target>
fn serialize_map(
&mut self, _len: Option<usize>)
-> Result<MapState, Error> {
Ok(MapState(None))
Ok(MapState { key: None })
}
/// Serializes a map key.
@ -394,7 +409,7 @@ impl<'output, Target> ser::Serializer for Serializer<'output, Target>
-> Result<(), Error>
where T: ser::Serialize
{
key.serialize(&mut key::MapKeySerializer::new(&mut state.0))
key.serialize(&mut key::MapKeySerializer::new(&mut state.key))
}
/// Serializes a map value.
@ -404,7 +419,7 @@ impl<'output, Target> ser::Serializer for Serializer<'output, Target>
where T: ser::Serialize
{
let mut value_serializer =
try!(value::ValueSerializer::new(&mut state.0, self.0));
try!(value::ValueSerializer::new(&mut state.key, self.urlencoder));
value.serialize(&mut value_serializer)
}
@ -417,7 +432,7 @@ impl<'output, Target> ser::Serializer for Serializer<'output, Target>
fn serialize_struct(
&mut self, _name: &'static str, _len: usize)
-> Result<StructState, Error> {
Ok(StructState(()))
Ok(StructState { _state: () })
}
/// Serializes a struct element.
@ -431,7 +446,7 @@ impl<'output, Target> ser::Serializer for Serializer<'output, Target>
{
let mut key = Some(key.into());
let mut value_serializer =
value::ValueSerializer::new(&mut key, self.0).unwrap();
value::ValueSerializer::new(&mut key, self.urlencoder).unwrap();
value.serialize(&mut value_serializer)
}