perde_core/decode/
option.rs1use crate::{schema::*, types::Object};
2use serde::de::{self, DeserializeSeed, Deserializer, Visitor};
3use std::fmt;
4
5pub struct OptionVisitor<'a>(pub &'a Optional);
6
7impl<'a, 'de> Visitor<'de> for OptionVisitor<'a> {
8 type Value = Object;
9
10 fn expecting(&self, f: &mut fmt::Formatter) -> fmt::Result {
11 write!(f, "an option")
12 }
13
14 fn visit_none<E>(self) -> Result<Self::Value, E>
15 where
16 E: de::Error,
17 {
18 Ok(Object::new_none())
19 }
20
21 fn visit_some<D>(self, deserializer: D) -> Result<Self::Value, D::Error>
22 where
23 D: Deserializer<'de>,
24 {
25 (&*self.0.value).deserialize(deserializer)
26 }
27}
28
29impl<'a, 'de> DeserializeSeed<'de> for &'a Optional {
30 type Value = Object;
31
32 fn deserialize<D>(self, deserializer: D) -> Result<Self::Value, D::Error>
33 where
34 D: Deserializer<'de>,
35 {
36 deserializer.deserialize_option(OptionVisitor(self))
37 }
38}