1 // Copyright (c) 2020 Nikita Pekin and the lazycell contributors 2 // See the README.md file at the top-level directory of this distribution. 3 // 4 // Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or 5 // http://www.apache.org/licenses/LICENSE-2.0> or the MIT license 6 // <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your 7 // option. This file may not be copied, modified, or distributed 8 // except according to those terms.use serde::ser::{Serialize, Serializer}; 9 use serde::ser::{Serialize, Serializer}; 10 use serde::de::{self, Deserialize, Deserializer, Visitor}; 11 12 use std::fmt; 13 use std::marker::PhantomData; 14 15 use super::{LazyCell, AtomicLazyCell}; 16 17 impl<T: Serialize> Serialize for LazyCell<T> { serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error>18 fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> { 19 match self.borrow() { 20 Some(val) => serializer.serialize_some(val), 21 None => serializer.serialize_none() 22 } 23 } 24 } 25 26 27 impl<T: Serialize> Serialize for AtomicLazyCell<T> { serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error>28 fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> { 29 match self.borrow() { 30 Some(val) => serializer.serialize_some(val), 31 None => serializer.serialize_none() 32 } 33 } 34 } 35 36 struct LazyCellVisitor<T>(PhantomData<*const T>); 37 impl<'de, T: Deserialize<'de>> Visitor<'de> for LazyCellVisitor<T> { 38 type Value = LazyCell<T>; 39 expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result40 fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { 41 formatter.write_str("a LazyCell") 42 } 43 visit_some<D: Deserializer<'de>>(self, deserializer: D) -> Result<Self::Value, D::Error>44 fn visit_some<D: Deserializer<'de>>(self, deserializer: D) -> Result<Self::Value, D::Error> { 45 let mut cell = LazyCell::new(); 46 cell.replace(T::deserialize(deserializer)?); 47 Ok(cell) 48 } 49 visit_none<E: de::Error>(self) -> Result<Self::Value, E>50 fn visit_none<E: de::Error>(self) -> Result<Self::Value, E> { 51 Ok(LazyCell::new()) 52 } 53 } 54 55 impl<'de, T: Deserialize<'de>> Deserialize<'de> for LazyCell<T> { deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error>56 fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> { 57 deserializer.deserialize_option(LazyCellVisitor(PhantomData)) 58 } 59 } 60 61 62 struct AtomicLazyCellVisitor<T>(PhantomData<*const T>); 63 impl<'de, T: Deserialize<'de>> Visitor<'de> for AtomicLazyCellVisitor<T> { 64 type Value = AtomicLazyCell<T>; 65 expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result66 fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { 67 formatter.write_str("an AtomicLazyCell") 68 } 69 visit_some<D: Deserializer<'de>>(self, deserializer: D) -> Result<Self::Value, D::Error>70 fn visit_some<D: Deserializer<'de>>(self, deserializer: D) -> Result<Self::Value, D::Error> { 71 let mut cell = AtomicLazyCell::new(); 72 cell.replace(T::deserialize(deserializer)?); 73 Ok(cell) 74 } 75 visit_none<E: de::Error>(self) -> Result<Self::Value, E>76 fn visit_none<E: de::Error>(self) -> Result<Self::Value, E> { 77 Ok(AtomicLazyCell::new()) 78 } 79 } 80 81 82 impl<'de, T: Deserialize<'de>> Deserialize<'de> for AtomicLazyCell<T> { deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error>83 fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> { 84 deserializer.deserialize_option(AtomicLazyCellVisitor(PhantomData)) 85 } 86 } 87