Skip to main content

cgp_serde/providers/
default.rs

1use cgp::prelude::*;
2use serde::de::Visitor;
3
4use crate::components::{ValueDeserializer, ValueDeserializerComponent};
5
6#[cgp_impl(new DeserializeDefault<Provider>)]
7#[use_provider(Provider: ValueDeserializer<'a, Value>)]
8impl<'a, Value, Provider> ValueDeserializer<'a, Value>
9where
10    Value: Default,
11{
12    fn deserialize<D>(&self, deserializer: D) -> Result<Value, D::Error>
13    where
14        D: serde::Deserializer<'a>,
15    {
16        deserializer.deserialize_option(DefaultVisitor {
17            context: self,
18            phantom: PhantomData::<(Value, Provider)>,
19        })
20    }
21}
22
23struct DefaultVisitor<'a, Context, Value, Provider> {
24    pub context: &'a Context,
25    pub phantom: PhantomData<(Value, Provider)>,
26}
27
28impl<'a, 'de, Context, Value, Provider> Visitor<'de>
29    for DefaultVisitor<'a, Context, Value, Provider>
30where
31    Value: Default,
32    Provider: ValueDeserializer<'de, Context, Value>,
33{
34    type Value = Value;
35
36    fn expecting(&self, formatter: &mut alloc::fmt::Formatter) -> alloc::fmt::Result {
37        formatter.write_str("optional")
38    }
39
40    fn visit_none<E>(self) -> Result<Value, E>
41    where
42        E: serde::de::Error,
43    {
44        Ok(Value::default())
45    }
46
47    fn visit_some<D>(self, deserializer: D) -> Result<Value, D::Error>
48    where
49        D: serde::Deserializer<'de>,
50    {
51        Provider::deserialize(self.context, deserializer)
52    }
53}