diff options
author | Sam Scott <sam.scott89@gmail.com> | 2017-04-25 11:11:39 +0100 |
---|---|---|
committer | Sam Scott <sam.scott89@gmail.com> | 2017-04-25 11:14:43 +0100 |
commit | 7f4764dd6b63c0c0cf0d27268dfa812c0f2334fc (patch) | |
tree | 7196fad8b398c5e235bf149739285c9102d02759 /src | |
parent | 53b0c87687fc6dd2f8bca5c4277a41e3e281025d (diff) |
Implement deserializing primitives properly.
This finishes the work to upgrade to serde 1.0.
Thanks to @kardeiz for starting the work in issue #3.
This also clairifies how enums work with serde_qs: only
with adjacently tagged enums for the time being.
Diffstat (limited to 'src')
-rw-r--r-- | src/de.rs | 53 |
1 files changed, 39 insertions, 14 deletions
@@ -564,6 +564,32 @@ impl<'de> de::MapAccess<'de> for Deserializer { struct LevelDeserializer(Level); +macro_rules! deserialize_primitive { + ($ty:ident, $method:ident, $visit_method:ident) => ( + fn $method<V>(self, visitor: V) -> Result<V::Value, Self::Error> + where V: de::Visitor<'de>, + { + match self.0 { + Level::Nested(map) => { + Deserializer::with_map(map).deserialize_map(visitor) + }, + Level::Sequence(seq) => { + SeqDeserializer::new(seq.into_iter()).deserialize_any(visitor) + }, + Level::Flat(x) => { + visitor.$visit_method(str::FromStr::from_str(&x).unwrap()) + // visitor.visit_u32(str::FromStr::from_str(&x).or_else(|_| { + // Err(de::Error::custom(format!("Unexpected string: {}", x))) + // })) + }, + Level::Invalid(e) => { + Err(de::Error::custom(e)) + } + } + } + ) +} + impl<'de> de::Deserializer<'de> for LevelDeserializer { type Error = Error; @@ -578,7 +604,7 @@ impl<'de> de::Deserializer<'de> for LevelDeserializer { SeqDeserializer::new(seq.into_iter()).deserialize_any(visitor) }, Level::Flat(x) => { - x.into_deserializer().deserialize_any(visitor) + visitor.visit_string(x) }, Level::Invalid(e) => { Err(de::Error::custom(e)) @@ -642,30 +668,29 @@ impl<'de> de::Deserializer<'de> for LevelDeserializer { } } + deserialize_primitive!(bool, deserialize_bool, visit_bool); + deserialize_primitive!(i8, deserialize_i8, visit_i8); + deserialize_primitive!(i16, deserialize_i16, visit_i16); + deserialize_primitive!(i32, deserialize_i32, visit_i32); + deserialize_primitive!(i64, deserialize_i64, visit_i64); + deserialize_primitive!(u8, deserialize_u8, visit_u8); + deserialize_primitive!(u16, deserialize_u16, visit_u16); + deserialize_primitive!(u32, deserialize_u32, visit_u32); + deserialize_primitive!(u64, deserialize_u64, visit_u64); + deserialize_primitive!(f32, deserialize_f32, visit_f32); + deserialize_primitive!(f64, deserialize_f64, visit_f64); + forward_to_deserialize_any! { - bool - u8 - u16 - u32 - u64 - i8 - i16 - i32 - i64 - f32 - f64 char str string unit - // option bytes byte_buf unit_struct newtype_struct tuple_struct - // struct_field identifier tuple enum |