summaryrefslogtreecommitdiff
path: root/serde_dhall
diff options
context:
space:
mode:
authorNadrieril2020-03-13 14:30:15 +0000
committerNadrieril2020-03-31 21:44:01 +0100
commit60425d58151fef142b066d523dc4d5e832070b9c (patch)
tree331d1b5e9c29f56a72340f17de0a1d6f9f93462e /serde_dhall
parent94850b720b0171444694452027f1baf947b3c18f (diff)
Add new Value type in API
Diffstat (limited to '')
-rw-r--r--serde_dhall/src/lib.rs47
-rw-r--r--serde_dhall/src/serde.rs4
2 files changed, 24 insertions, 27 deletions
diff --git a/serde_dhall/src/lib.rs b/serde_dhall/src/lib.rs
index d019238..1f7ecf8 100644
--- a/serde_dhall/src/lib.rs
+++ b/serde_dhall/src/lib.rs
@@ -183,38 +183,26 @@ pub use value::Value;
// A Dhall value.
#[doc(hidden)]
pub mod value {
- use dhall::{Normalized, NormalizedExpr, Parsed, SimpleType, SimpleValue};
+ use dhall::{SimpleType, SimpleValue};
use super::de::Error;
use super::Type;
/// A Dhall value
#[derive(Debug, Clone, PartialEq, Eq)]
- pub struct Value(pub(crate) Normalized);
+ pub struct Value(pub(crate) dhall::Value);
impl Value {
pub fn from_str(s: &str, ty: Option<&Type>) -> super::de::Result<Self> {
- Value::from_str_using_dhall_error_type(s, ty).map_err(Error::Dhall)
+ let ty = ty.map(|t| t.to_dhall_value());
+ let val = dhall::Value::from_str_with_annot(s, ty.as_ref())
+ .map_err(Error::Dhall)?;
+ Ok(Value(val))
}
- fn from_str_using_dhall_error_type(
- s: &str,
- ty: Option<&Type>,
- ) -> dhall::error::Result<Self> {
- let resolved = Parsed::parse_str(s)?.resolve()?;
- let typed = match ty {
- None => resolved.typecheck()?,
- Some(t) => resolved.typecheck_with(&t.to_normalized())?,
- };
- Ok(Value(typed.normalize()))
- }
- pub(crate) fn to_simple_value(
- &self,
- ) -> Result<SimpleValue, NormalizedExpr> {
+ pub(crate) fn to_simple_value(&self) -> Option<SimpleValue> {
self.0.to_simple_value()
}
- pub(crate) fn to_simple_type(
- &self,
- ) -> Result<SimpleType, NormalizedExpr> {
+ pub(crate) fn to_simple_type(&self) -> Option<SimpleType> {
self.0.to_simple_type()
}
}
@@ -226,12 +214,21 @@ pub mod value {
Ok(v.clone())
}
}
+
+ impl std::fmt::Display for Value {
+ fn fmt(
+ &self,
+ f: &mut std::fmt::Formatter,
+ ) -> Result<(), std::fmt::Error> {
+ self.0.fmt(f)
+ }
+ }
}
// A Dhall type.
#[doc(hidden)]
pub mod ty {
- use dhall::{Normalized, STyKind, SimpleType};
+ use dhall::{STyKind, SimpleType};
use super::de::Error;
@@ -240,8 +237,8 @@ pub mod ty {
pub struct Type(SimpleType);
impl Type {
- pub(crate) fn to_normalized(&self) -> Normalized {
- self.0.clone().into_normalized()
+ pub(crate) fn to_dhall_value(&self) -> dhall::Value {
+ self.0.clone().into_normalized().to_value()
}
pub(crate) fn from_simple_type(ty: SimpleType) -> Self {
@@ -279,10 +276,10 @@ pub mod ty {
impl super::de::Deserialize for Type {
fn from_dhall(v: &super::Value) -> super::de::Result<Self> {
- let sty = v.to_simple_type().map_err(|expr| {
+ let sty = v.to_simple_type().ok_or_else(|| {
Error::Deserialize(format!(
"this cannot be deserialized into a simple type: {}",
- expr
+ v
))
})?;
Ok(Type(sty))
diff --git a/serde_dhall/src/serde.rs b/serde_dhall/src/serde.rs
index 9cb67d1..5d8fcf3 100644
--- a/serde_dhall/src/serde.rs
+++ b/serde_dhall/src/serde.rs
@@ -19,10 +19,10 @@ where
T: serde::Deserialize<'a>,
{
fn from_dhall(v: &Value) -> Result<Self> {
- let sval = v.to_simple_value().map_err(|expr| {
+ let sval = v.to_simple_value().ok_or_else(|| {
Error::Deserialize(format!(
"this cannot be deserialized into the serde data model: {}",
- expr
+ v
))
})?;
T::deserialize(Deserializer(Cow::Owned(sval)))