cgp_serde/providers/
default.rs1use 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}