1use super::{DeserializeHelper, Expected, Tracker, TrackerDeserializer, TrackerFor, TrackerWrapper};
2
3#[derive(Debug)]
4pub struct OptionalTracker<T>(pub Option<T>);
5
6impl<T: Tracker> TrackerWrapper for OptionalTracker<T> {
7 type Tracker = T;
8}
9
10impl<T> std::ops::Deref for OptionalTracker<T> {
11 type Target = Option<T>;
12
13 fn deref(&self) -> &Self::Target {
14 &self.0
15 }
16}
17
18impl<T> std::ops::DerefMut for OptionalTracker<T> {
19 fn deref_mut(&mut self) -> &mut Self::Target {
20 &mut self.0
21 }
22}
23
24impl<T> Default for OptionalTracker<T> {
25 fn default() -> Self {
26 Self(None)
27 }
28}
29
30impl<T: Tracker> Tracker for OptionalTracker<T> {
31 type Target = Option<T::Target>;
32
33 fn allow_duplicates(&self) -> bool {
34 self.0.as_ref().map(|t| t.allow_duplicates()).unwrap_or(false)
35 }
36}
37
38impl<T: TrackerFor> TrackerFor for Option<T> {
39 type Tracker = OptionalTracker<T::Tracker>;
40}
41
42impl<'de, T> serde::de::DeserializeSeed<'de> for DeserializeHelper<'_, OptionalTracker<T>>
43where
44 for<'a> DeserializeHelper<'a, T>: serde::de::DeserializeSeed<'de, Value = ()>,
45 T: Tracker + Default,
46 T::Target: Default,
47{
48 type Value = ();
49
50 fn deserialize<D>(self, de: D) -> Result<Self::Value, D::Error>
51 where
52 D: serde::Deserializer<'de>,
53 {
54 if let Some(value) = self.value {
55 DeserializeHelper {
56 value,
57 tracker: self.tracker.get_or_insert_default(),
58 }
59 .deserialize(de)
60 } else {
61 de.deserialize_option(self)
62 }
63 }
64}
65
66impl<'de, T> serde::de::Visitor<'de> for DeserializeHelper<'_, OptionalTracker<T>>
67where
68 for<'a> DeserializeHelper<'a, T>: serde::de::DeserializeSeed<'de, Value = ()>,
69 T: Tracker + Default,
70 T::Target: Default,
71{
72 type Value = ();
73
74 fn expecting(&self, formatter: &mut std::fmt::Formatter) -> std::fmt::Result {
75 Option::<T::Target>::expecting(formatter)
76 }
77
78 fn visit_none<E>(self) -> Result<Self::Value, E>
79 where
80 E: serde::de::Error,
81 {
82 Ok(())
83 }
84
85 fn visit_some<D>(self, de: D) -> Result<Self::Value, D::Error>
86 where
87 D: serde::de::Deserializer<'de>,
88 {
89 serde::de::DeserializeSeed::deserialize(
90 DeserializeHelper {
91 value: self.value.get_or_insert_default(),
92 tracker: self.tracker.get_or_insert_default(),
93 },
94 de,
95 )
96 }
97}
98
99impl<'de, T> TrackerDeserializer<'de> for OptionalTracker<T>
100where
101 for<'a> DeserializeHelper<'a, T>: serde::de::DeserializeSeed<'de, Value = ()>,
102 T: Tracker + Default,
103 T::Target: Default,
104{
105 fn deserialize<D>(&mut self, value: &mut Self::Target, deserializer: D) -> Result<(), D::Error>
106 where
107 D: super::DeserializeContent<'de>,
108 {
109 deserializer.deserialize_seed(DeserializeHelper { value, tracker: self })
110 }
111}