diff options
author | Nadrieril | 2020-05-10 22:09:43 +0100 |
---|---|---|
committer | Nadrieril | 2020-10-28 22:52:41 +0000 |
commit | e070270c3f1f10d46281ed7751ff95e15092e7f4 (patch) | |
tree | 46c22c75f209c5112030f3db6609ed64ff4888d3 /serde_dhall/src/deserialize.rs | |
parent | 5f3ca811f09dcf6f09fb9b60fcd2664d06762f39 (diff) |
Implement serialization
Diffstat (limited to 'serde_dhall/src/deserialize.rs')
-rw-r--r-- | serde_dhall/src/deserialize.rs | 16 |
1 files changed, 13 insertions, 3 deletions
diff --git a/serde_dhall/src/deserialize.rs b/serde_dhall/src/deserialize.rs index 12b4703..0e518ea 100644 --- a/serde_dhall/src/deserialize.rs +++ b/serde_dhall/src/deserialize.rs @@ -47,8 +47,6 @@ pub trait FromDhall: Sealed + Sized { impl<T> Sealed for T where T: serde::de::DeserializeOwned {} -struct Deserializer<'a>(Cow<'a, SimpleValue>); - /// Deserialize a Rust value from a Dhall [`SimpleValue`]. /// /// # Example @@ -109,6 +107,8 @@ where } } +struct Deserializer<'a>(Cow<'a, SimpleValue>); + impl<'de: 'a, 'a> serde::de::IntoDeserializer<'de, Error> for Deserializer<'a> { type Deserializer = Deserializer<'a>; fn into_deserializer(self) -> Self::Deserializer { @@ -171,9 +171,19 @@ impl<'de: 'a, 'a> serde::Deserializer<'de> for Deserializer<'a> { } } + fn deserialize_unit<V>(self, visitor: V) -> crate::Result<V::Value> + where + V: serde::de::Visitor<'de>, + { + match self.0.as_ref() { + SimpleValue::Record(m) if m.is_empty() => visitor.visit_unit(), + _ => self.deserialize_any(visitor), + } + } + serde::forward_to_deserialize_any! { bool i8 i16 i32 i64 i128 u8 u16 u32 u64 u128 f32 f64 char str string - bytes byte_buf option unit unit_struct newtype_struct seq + bytes byte_buf option unit_struct newtype_struct seq tuple_struct map struct enum identifier ignored_any } } |