summaryrefslogtreecommitdiff
path: root/serde_dhall
diff options
context:
space:
mode:
authorNadrieril2019-12-20 19:33:00 +0000
committerNadrieril2019-12-20 19:39:54 +0000
commit6d2c56cc13303ddea6b7f46d5d34659c6c558d19 (patch)
treec542ad7bfce433a4446bf50794e934de74aadd06 /serde_dhall
parentde0dd59204e979e29445d634a0739394110261ef (diff)
Seal `Deserialize` trait
Fixes #81
Diffstat (limited to 'serde_dhall')
-rw-r--r--serde_dhall/src/lib.rs9
-rw-r--r--serde_dhall/src/serde.rs2
2 files changed, 9 insertions, 2 deletions
diff --git a/serde_dhall/src/lib.rs b/serde_dhall/src/lib.rs
index 2863788..d8a94d1 100644
--- a/serde_dhall/src/lib.rs
+++ b/serde_dhall/src/lib.rs
@@ -179,6 +179,8 @@ pub mod value {
}
}
+ impl super::de::sealed::Sealed for Value {}
+
impl super::de::Deserialize for Value {
fn from_dhall(v: &Value) -> Result<Self> {
Ok(v.clone())
@@ -225,14 +227,17 @@ pub mod de {
}
}
+ pub(crate) mod sealed {
+ pub trait Sealed {}
+ }
+
/// A data structure that can be deserialized from a Dhall expression
///
/// This is automatically implemented for any type that [serde][serde]
/// can deserialize.
///
/// This trait cannot be implemented manually.
- // TODO: seal trait
- pub trait Deserialize: Sized {
+ pub trait Deserialize: sealed::Sealed + Sized {
/// See [serde_dhall::from_str][crate::from_str]
fn from_dhall(v: &Value) -> Result<Self>;
}
diff --git a/serde_dhall/src/serde.rs b/serde_dhall/src/serde.rs
index cf5efc4..99b9014 100644
--- a/serde_dhall/src/serde.rs
+++ b/serde_dhall/src/serde.rs
@@ -6,6 +6,8 @@ use dhall::syntax::ExprKind;
use crate::de::{Deserialize, Error, Result};
use crate::Value;
+impl<'a, T> crate::de::sealed::Sealed for T where T: serde::Deserialize<'a> {}
+
impl<'a, T> Deserialize for T
where
T: serde::Deserialize<'a>,