Support deserializing newtypes

Closes #196
This commit is contained in:
Alex Crichton 2017-07-06 07:34:45 -07:00
parent 5bd60e7397
commit 7a8c535c5a
3 changed files with 38 additions and 3 deletions

View file

@ -248,7 +248,6 @@ impl<'de, 'b> de::Deserializer<'de> for &'b mut Deserializer<'de> {
}
}
forward_to_deserialize_any! {
bool u8 u16 u32 u64 i8 i16 i32 i64 f32 f64 char str string seq
bytes byte_buf map struct unit newtype_struct
@ -560,9 +559,19 @@ impl<'de> de::Deserializer<'de> for ValueDeserializer<'de> {
}
}
fn deserialize_newtype_struct<V>(
self,
_name: &'static str,
visitor: V
) -> Result<V::Value, Error>
where V: de::Visitor<'de>
{
visitor.visit_newtype_struct(self)
}
forward_to_deserialize_any! {
bool u8 u16 u32 u64 i8 i16 i32 i64 f32 f64 char str string seq
bytes byte_buf map unit newtype_struct identifier
bytes byte_buf map unit identifier
ignored_any unit_struct tuple_struct tuple
}
}

View file

@ -544,10 +544,20 @@ impl<'de> de::Deserializer<'de> for Value {
visitor.visit_some(self)
}
fn deserialize_newtype_struct<V>(
self,
_name: &'static str,
visitor: V
) -> Result<V::Value, ::de::Error>
where V: de::Visitor<'de>
{
visitor.visit_newtype_struct(self)
}
forward_to_deserialize_any! {
bool u8 u16 u32 u64 i8 i16 i32 i64 f32 f64 char str string unit seq
bytes byte_buf map unit_struct tuple_struct struct
tuple ignored_any newtype_struct identifier
tuple ignored_any identifier
}
}

View file

@ -509,3 +509,19 @@ fn extra_keys() {
assert!(toml.clone().try_into::<Foo>().is_ok());
assert!(toml::from_str::<Foo>(&toml.to_string()).is_ok());
}
#[test]
fn newtypes() {
#[derive(Deserialize, Serialize, PartialEq, Debug, Clone)]
struct A {
b: B
}
#[derive(Deserialize, Serialize, PartialEq, Debug, Clone)]
struct B(u32);
equivalent! {
A { b: B(2) },
Table(map! { b: Integer(2) }),
}
}