diff options
author | Nadrieril | 2019-04-11 13:14:13 +0200 |
---|---|---|
committer | Nadrieril | 2019-04-11 13:14:13 +0200 |
commit | d3f14966120fae672dc890b718ebada74ebed533 (patch) | |
tree | 887b4af84bc2c69886616a4a9c8aa27fa846238a /dhall/src/traits/deserialize.rs | |
parent | 982f86c34f69bb78b45a4b8b37a5bf5731f881eb (diff) | |
parent | 82d62c4d7d423817a4fd9d6294d27d18d60bcd22 (diff) |
Merge branch 'serde'
Diffstat (limited to '')
-rw-r--r-- | dhall/src/traits/deserialize.rs | 46 |
1 files changed, 46 insertions, 0 deletions
diff --git a/dhall/src/traits/deserialize.rs b/dhall/src/traits/deserialize.rs new file mode 100644 index 0000000..1fbdfe1 --- /dev/null +++ b/dhall/src/traits/deserialize.rs @@ -0,0 +1,46 @@ +use crate::error::*; +use crate::expr::*; + +pub trait Deserialize<'a>: Sized { + fn from_str(s: &'a str, ty: Option<&Type>) -> Result<Self>; +} + +impl<'a> Deserialize<'a> for Parsed { + /// Simply parses the provided string. Ignores the + /// provided type. + fn from_str(s: &'a str, _: Option<&Type>) -> Result<Self> { + Ok(Parsed::parse_str(s)?) + } +} + +impl<'a> Deserialize<'a> for Resolved { + /// Parses and resolves the provided string. Ignores the + /// provided type. + fn from_str(s: &'a str, ty: Option<&Type>) -> Result<Self> { + Ok(Parsed::from_str(s, ty)?.resolve()?) + } +} + +impl<'a> Deserialize<'a> for Typed { + /// Parses, resolves and typechecks the provided string. + fn from_str(s: &'a str, ty: Option<&Type>) -> Result<Self> { + let resolved = Resolved::from_str(s, ty)?; + match ty { + None => Ok(resolved.typecheck()?), + Some(t) => Ok(resolved.typecheck_with(t)?), + } + } +} + +impl<'a> Deserialize<'a> for Normalized { + /// Parses, resolves, typechecks and normalizes the provided string. + fn from_str(s: &'a str, ty: Option<&Type>) -> Result<Self> { + Ok(Typed::from_str(s, ty)?.normalize()) + } +} + +impl<'a> Deserialize<'a> for Type { + fn from_str(s: &'a str, ty: Option<&Type>) -> Result<Self> { + Ok(Normalized::from_str(s, ty)?.into_type()) + } +} |