// Copyright (c) 2020 Nikita Pekin and the lazycell contributors // See the README.md file at the top-level directory of this distribution. // // Licensed under the Apache License, Version 2.0 or the MIT license // , at your // option. This file may not be copied, modified, or distributed // except according to those terms.use serde::ser::{Serialize, Serializer}; use serde::ser::{Serialize, Serializer}; use serde::de::{self, Deserialize, Deserializer, Visitor}; use std::fmt; use std::marker::PhantomData; use super::{LazyCell, AtomicLazyCell}; impl Serialize for LazyCell { fn serialize(&self, serializer: S) -> Result { match self.borrow() { Some(val) => serializer.serialize_some(val), None => serializer.serialize_none() } } } impl Serialize for AtomicLazyCell { fn serialize(&self, serializer: S) -> Result { match self.borrow() { Some(val) => serializer.serialize_some(val), None => serializer.serialize_none() } } } struct LazyCellVisitor(PhantomData<*const T>); impl<'de, T: Deserialize<'de>> Visitor<'de> for LazyCellVisitor { type Value = LazyCell; fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { formatter.write_str("a LazyCell") } fn visit_some>(self, deserializer: D) -> Result { let mut cell = LazyCell::new(); cell.replace(T::deserialize(deserializer)?); Ok(cell) } fn visit_none(self) -> Result { Ok(LazyCell::new()) } } impl<'de, T: Deserialize<'de>> Deserialize<'de> for LazyCell { fn deserialize>(deserializer: D) -> Result { deserializer.deserialize_option(LazyCellVisitor(PhantomData)) } } struct AtomicLazyCellVisitor(PhantomData<*const T>); impl<'de, T: Deserialize<'de>> Visitor<'de> for AtomicLazyCellVisitor { type Value = AtomicLazyCell; fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { formatter.write_str("an AtomicLazyCell") } fn visit_some>(self, deserializer: D) -> Result { let mut cell = AtomicLazyCell::new(); cell.replace(T::deserialize(deserializer)?); Ok(cell) } fn visit_none(self) -> Result { Ok(AtomicLazyCell::new()) } } impl<'de, T: Deserialize<'de>> Deserialize<'de> for AtomicLazyCell { fn deserialize>(deserializer: D) -> Result { deserializer.deserialize_option(AtomicLazyCellVisitor(PhantomData)) } }