From 068e8c647e7c419daa23a6568122f1ac1d48f593 Mon Sep 17 00:00:00 2001 From: Stephen Chung Date: Thu, 2 Dec 2021 12:50:11 +0800 Subject: [PATCH] Support Option in from_dynamic. --- CHANGELOG.md | 5 +++++ src/serde/de.rs | 11 +++++++++-- tests/serde.rs | 29 +++++++++++++++++++++++++++++ 3 files changed, 43 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 87c29f08..cb4a4bda 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,11 @@ Rhai Release Notes Version 1.2.2 ============= +Bug fixes +--------- + +* `from_dynamic` now supports deserializing `Option`. + Version 1.2.1 ============= diff --git a/src/serde/de.rs b/src/serde/de.rs index 8c7420e2..d860c3e4 100644 --- a/src/serde/de.rs +++ b/src/serde/de.rs @@ -363,8 +363,15 @@ impl<'de> Deserializer<'de> for &mut DynamicDeserializer<'de> { self.type_error() } - fn deserialize_option>(self, _: V) -> Result> { - self.type_error() + fn deserialize_option>( + self, + visitor: V, + ) -> Result> { + if self.value.is::<()>() { + visitor.visit_none() + } else { + visitor.visit_some(self) + } } fn deserialize_unit>(self, visitor: V) -> Result> { diff --git a/tests/serde.rs b/tests/serde.rs index ac98dc37..95bde973 100644 --- a/tests/serde.rs +++ b/tests/serde.rs @@ -746,3 +746,32 @@ fn test_serde_json() -> serde_json::Result<()> { Ok(()) } + +#[test] +#[cfg(not(feature = "no_object"))] +fn test_serde_optional() -> Result<(), Box> { + #[derive(Debug, Clone, PartialEq, Eq, Deserialize)] + struct TestStruct { + foo: Option, + } + + let mut engine = Engine::new(); + engine.register_type_with_name::("TestStruct"); + + let r = engine.eval::("#{ foo: 'a' }")?; + + assert_eq!( + from_dynamic::(&r)?, + TestStruct { foo: Some('a') } + ); + + let r = engine.eval::("#{ foo: () }")?; + + assert_eq!(from_dynamic::(&r)?, TestStruct { foo: None }); + + let r = engine.eval::("#{ }")?; + + assert_eq!(from_dynamic::(&r)?, TestStruct { foo: None }); + + Ok(()) +}