diff --git a/serde/src/de/impls.rs b/serde/src/de/impls.rs index 59d90d2cc..5225ad636 100644 --- a/serde/src/de/impls.rs +++ b/serde/src/de/impls.rs @@ -50,6 +50,32 @@ impl<'de> Deserialize<'de> for ! { } } +#[cfg(feature = "unstable")] +impl<'de, T: Deserialize<'de>> Deserialize<'de> for core::lazy::OnceCell { + fn deserialize(deserializer: D) -> Result + where + D: Deserializer<'de>, + { + Ok(match Option::::deserialize(deserializer)? { + Some(value) => core::lazy::OnceCell::from(value), + None => core::lazy::OnceCell::new(), + }) + } +} + +#[cfg(all(feature = "unstable", feature = "std"))] +impl<'de, T: Deserialize<'de>> Deserialize<'de> for std::lazy::SyncOnceCell { + fn deserialize(deserializer: D) -> Result + where + D: Deserializer<'de>, + { + Ok(match Option::::deserialize(deserializer)? { + Some(value) => std::lazy::SyncOnceCell::from(value), + None => std::lazy::SyncOnceCell::new(), + }) + } +} + //////////////////////////////////////////////////////////////////////////////// struct BoolVisitor; diff --git a/serde/src/lib.rs b/serde/src/lib.rs index ecf305dc8..26e2cb8a1 100644 --- a/serde/src/lib.rs +++ b/serde/src/lib.rs @@ -92,6 +92,8 @@ // // https://github.com/serde-rs/serde/issues/812 #![cfg_attr(feature = "unstable", feature(never_type))] +// Support OnceCell in RFC #2788 +#![cfg_attr(feature = "unstable", feature(once_cell))] #![allow(unknown_lints, bare_trait_objects, deprecated)] #![cfg_attr(feature = "cargo-clippy", allow(renamed_and_removed_lints))] #![cfg_attr(feature = "cargo-clippy", deny(clippy, clippy_pedantic))] diff --git a/serde/src/ser/impls.rs b/serde/src/ser/impls.rs index c254ac654..59cc8254f 100644 --- a/serde/src/ser/impls.rs +++ b/serde/src/ser/impls.rs @@ -301,6 +301,32 @@ impl Serialize for ! { } } +#[cfg(feature = "unstable")] +impl Serialize for core::lazy::OnceCell { + fn serialize(&self, serializer: S) -> Result + where + S: Serializer, + { + match self.get() { + Some(value) => serializer.serialize_some(value), + None => serializer.serialize_none(), + } + } +} + +#[cfg(all(feature = "unstable", feature = "std"))] +impl Serialize for std::lazy::SyncOnceCell { + fn serialize(&self, serializer: S) -> Result + where + S: Serializer, + { + match self.get() { + Some(value) => serializer.serialize_some(value), + None => serializer.serialize_none(), + } + } +} + //////////////////////////////////////////////////////////////////////////////// macro_rules! tuple_impls {