diff options
-rw-r--r-- | src/de.rs | 37 | ||||
-rw-r--r-- | tests/test_deserialize.rs | 10 | ||||
-rw-r--r-- | tests/test_serialize.rs | 22 |
3 files changed, 27 insertions, 42 deletions
@@ -117,8 +117,8 @@ impl<'a, 'b> de::Deserializer for &'b mut Deserializer<'a> { // _serde::Deserializer::deserialize_struct(deserializer,"A", FIELDS, __Visitor) fn deserialize_struct<V>(self, - name: &'static str, - fields: &'static [&'static str], + _name: &'static str, + _fields: &'static [&'static str], visitor: V) -> Result<V::Value, Self::Error> where V: de::Visitor @@ -157,29 +157,22 @@ impl<'a, 'b> de::Deserializer for &'b mut Deserializer<'a> { } -use std::marker::PhantomData; use serde::de::MapVisitor; use std::iter; -use std::collections::hash_map::{Iter,IntoIter}; +use std::collections::hash_map::IntoIter; #[derive(Debug)] enum Level { Flat(String), Nested(String), } -struct FlatMapVisitor<'a, 'b> - where 'a: 'b +struct FlatMapVisitor { - de: &'b mut Deserializer<'a>, iter: iter::Peekable<iter::Fuse<IntoIter<String, Level>>>, - // iter: iter::Peekable<iter::Fuse<Iter<'c, String, String>>>, - } -use serde::de::value::CowStrDeserializer; -impl<'a, 'b, 'c> FlatMapVisitor<'a, 'b> - where 'a :'b +impl<'a, 'b, 'c> FlatMapVisitor { fn new(de: &'b mut Deserializer<'a>) -> Self { @@ -195,7 +188,6 @@ impl<'a, 'b, 'c> FlatMapVisitor<'a, 'b> }); debug_assert!(ldepth == rdepth); - // a[b][c][d] = 1 => a, b], c][d] if ldepth > 1 { let ksplit: Vec<&str> = k.splitn(3, '[').collect(); let a = ksplit[0]; @@ -206,11 +198,9 @@ impl<'a, 'b, 'c> FlatMapVisitor<'a, 'b> panic!("Tried adding a nested element to a flat level"); }, Some(&Level::Nested(ref x)) => { - // map.get(a) = x&b[c][d]=v format!("{}&{}[{}={}", &x, &b[..b.len()-1], &c, &v).into() }, None => { - // map.insert(a, b[c][d]=v) format!("{}[{}={}", &b[..b.len()-1],c, v).into() } }; @@ -239,21 +229,16 @@ impl<'a, 'b, 'c> FlatMapVisitor<'a, 'b> let x = match map.get(k.as_ref()) { Some(_) => { panic!("Attempted to set the value of {} twice", k); - // map.get(a) = x&b=v - // format!("{}&{}={}", &x, &b[..b.len()-1], &v).into() }, None => { v - // map.insert(a, b=v) - // format!("{}={}", &b[..b.len()-1], &v).into() } }; map.insert(k.into_owned(), Level::Flat(x.into_owned())); } } - println!("Map constructed: {:?}", map); + // println!("Map constructed: {:?}", map); FlatMapVisitor { - de: de, iter: map.into_iter().fuse().peekable(), } } @@ -264,18 +249,10 @@ impl<'a, 'b, 'c> FlatMapVisitor<'a, 'b> use serde::de::value::ValueDeserializer; -impl<'a, 'b, 'c> de::MapVisitor for FlatMapVisitor<'a, 'b> { +impl de::MapVisitor for FlatMapVisitor { type Error = Error; - // __Visitor::visit_map - // visit_map -> visit_key::<__Field> -> - // MapVisitor::visit_key::<__Field>() - // -> visit_key_seed(PhantomData<__Field>) - // -> __Field::deserialize() - // seed.deserialize(key.into_deserializer()) - // becoes flat(seed).deserialize() - // Swap for visit_key_seed(FlatDeserializer<__Field>) fn visit_key_seed<K>(&mut self, seed: K) -> Result<Option<K::Value>, Error> where K: de::DeserializeSeed, { diff --git a/tests/test_deserialize.rs b/tests/test_deserialize.rs index 0d689d9..776d562 100644 --- a/tests/test_deserialize.rs +++ b/tests/test_deserialize.rs @@ -46,9 +46,17 @@ fn deserialize_struct() { c2: 7 } }; - let input = urlencode("b[b1]=10&b[b2]=Ten&c[c1]=Seven&c[c2]=7"); + let input = "b[b1]=10&b[b2]=Ten&c[c1]=Seven&c[c2]=7"; + let input2 = "c[c1]=Seven&b[b2]=Ten&b[b1]=10&c[c2]=7"; + let result: A = serde_urlencoded::from_str(&urlencode(input)).unwrap(); + assert_eq!(result, params); let result: A = serde_urlencoded::from_str(&input).unwrap(); assert_eq!(result, params); + let result: A = serde_urlencoded::from_str(&urlencode(input2)).unwrap(); + assert_eq!(result, params); + let result: A = serde_urlencoded::from_str(&input2).unwrap(); + assert_eq!(result, params); + } fn urlencode(input: &str) -> String { diff --git a/tests/test_serialize.rs b/tests/test_serialize.rs index 91c4d1a..75dfc61 100644 --- a/tests/test_serialize.rs +++ b/tests/test_serialize.rs @@ -36,27 +36,27 @@ fn serialize_map_bool() { } #[derive(Serialize, Deserialize)] -struct A { b: B, c: C } +struct Foo { bar: Bar, baz: Baz } #[derive(Serialize, Deserialize)] -struct B { b1: u8, b2: String } +struct Bar { x: u8, y: String } #[derive(Serialize, Deserialize)] -struct C { c1: String, c2: u8 } +struct Baz { thing: String, other: u8 } #[test] fn serialize_struct() { - let params = A { - b: B { - b1: 10, - b2: "Ten".to_owned() + let params = Foo { + bar: Bar { + x: 10, + y: "Ten".to_owned() }, - c: C { - c1: "Seven".to_owned(), - c2: 7 + baz: Baz { + thing: "Thing".to_owned(), + other: 12 } }; assert_eq!(serde_urlencoded::to_string(¶ms), - Ok(urlencode("b[b1]=10&b[b2]=Ten&c[c1]=Seven&c[c2]=7"))); + Ok(urlencode("bar[x]=10&bar[y]=Ten&baz[thing]=Thing&baz[other]=12"))); } fn urlencode(input: &str) -> String { |