summaryrefslogtreecommitdiff
path: root/serde_dhall/src/deserialize.rs
diff options
context:
space:
mode:
authorBenjamin Levy2020-10-24 04:24:21 -0400
committerBenjamin Levy2020-10-24 04:24:21 -0400
commit34a4727366e8efb4f9d51c9f636ebcda580173b0 (patch)
treee5bae5c7a70f2c3721baf2e8a4c3683c5dfb71dc /serde_dhall/src/deserialize.rs
parent41b303c00392571fe8c862041b811f7716e38b57 (diff)
Make SimpleValue public and add from_simple_value()
Diffstat (limited to 'serde_dhall/src/deserialize.rs')
-rw-r--r--serde_dhall/src/deserialize.rs47
1 files changed, 46 insertions, 1 deletions
diff --git a/serde_dhall/src/deserialize.rs b/serde_dhall/src/deserialize.rs
index 92be2e9..6d3aab8 100644
--- a/serde_dhall/src/deserialize.rs
+++ b/serde_dhall/src/deserialize.rs
@@ -45,6 +45,51 @@ 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
+///
+/// ```rust
+/// # fn main() -> serde_dhall::Result<()> {
+/// use std::collections::BTreeMap;
+/// use serde::Deserialize;
+///
+/// // We use serde's derive feature
+/// #[derive(Deserialize)]
+/// struct Point {
+/// x: u64,
+/// y: u64,
+/// }
+///
+/// // Some Dhall data
+/// let mut data = BTreeMap::new();
+/// data.insert(
+/// "x".to_string(),
+/// serde_dhall::SimpleValue::Num(serde_dhall::NumKind::Natural(1))
+/// );
+/// data.insert(
+/// "y".to_string(),
+/// serde_dhall::SimpleValue::Num(serde_dhall::NumKind::Natural(2))
+/// );
+/// let data = serde_dhall::SimpleValue::Record(data);
+///
+/// // Parse the Dhall value as a Point.
+/// let point: Point = serde_dhall::from_simple_value(data)?;
+///
+/// assert_eq!(point.x, 1);
+/// assert_eq!(point.y, 2);
+/// # Ok(())
+/// # }
+/// ```
+///
+/// [`SimpleValue`]: enum.SimpleValue.html
+pub fn from_simple_value<T>(v: SimpleValue) -> Result<T>
+where
+ T: serde::de::DeserializeOwned,
+{
+ T::deserialize(Deserializer(Cow::Owned(v)))
+}
+
impl<T> FromDhall for T
where
T: serde::de::DeserializeOwned,
@@ -56,7 +101,7 @@ where
v
)))
})?;
- T::deserialize(Deserializer(Cow::Owned(sval)))
+ from_simple_value(sval)
}
}