tinc/private/
optional.rs

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}