Skip to main content

perde_core/decode/
option.rs

1use 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}