Skip to content

Commit

Permalink
Support std::lazy::OnceCell (unstable: RFC 2788)
Browse files Browse the repository at this point in the history
See also serde-rs#812 for other unstable functionality in serde.

Fixes serde-rs#1952
  • Loading branch information
Techcable committed Oct 17, 2021
1 parent 5b14036 commit 81ffba4
Show file tree
Hide file tree
Showing 3 changed files with 54 additions and 0 deletions.
26 changes: 26 additions & 0 deletions serde/src/de/impls.rs
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,32 @@ impl<'de> Deserialize<'de> for ! {
}
}

#[cfg(feature = "unstable")]
impl<'de, T: Deserialize<'de>> Deserialize<'de> for core::lazy::OnceCell<T> {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where
D: Deserializer<'de>,
{
Ok(match Option::<T>::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<T> {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where
D: Deserializer<'de>,
{
Ok(match Option::<T>::deserialize(deserializer)? {
Some(value) => std::lazy::SyncOnceCell::from(value),
None => std::lazy::SyncOnceCell::new(),
})
}
}

////////////////////////////////////////////////////////////////////////////////

struct BoolVisitor;
Expand Down
2 changes: 2 additions & 0 deletions serde/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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))]
Expand Down
26 changes: 26 additions & 0 deletions serde/src/ser/impls.rs
Original file line number Diff line number Diff line change
Expand Up @@ -301,6 +301,32 @@ impl Serialize for ! {
}
}

#[cfg(feature = "unstable")]
impl<T: Serialize> Serialize for core::lazy::OnceCell<T> {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: Serializer,
{
match self.get() {
Some(value) => serializer.serialize_some(value),
None => serializer.serialize_none(),
}
}
}

#[cfg(all(feature = "unstable", feature = "std"))]
impl<T: Serialize> Serialize for std::lazy::SyncOnceCell<T> {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: Serializer,
{
match self.get() {
Some(value) => serializer.serialize_some(value),
None => serializer.serialize_none(),
}
}
}

////////////////////////////////////////////////////////////////////////////////

macro_rules! tuple_impls {
Expand Down

0 comments on commit 81ffba4

Please sign in to comment.