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! { forward_to_deserialize_any! {
bool u8 u16 u32 u64 i8 i16 i32 i64 f32 f64 char str string seq bool u8 u16 u32 u64 i8 i16 i32 i64 f32 f64 char str string seq
bytes byte_buf map struct unit newtype_struct 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! { forward_to_deserialize_any! {
bool u8 u16 u32 u64 i8 i16 i32 i64 f32 f64 char str string seq 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 ignored_any unit_struct tuple_struct tuple
} }
} }

View file

@ -544,10 +544,20 @@ impl<'de> de::Deserializer<'de> for Value {
visitor.visit_some(self) 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! { forward_to_deserialize_any! {
bool u8 u16 u32 u64 i8 i16 i32 i64 f32 f64 char str string unit seq 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 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.clone().try_into::<Foo>().is_ok());
assert!(toml::from_str::<Foo>(&toml.to_string()).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) }),
}
}