tinc/private/
repeated.rs

1use super::{DeserializeHelper, Expected, SerdePathToken, Tracker, TrackerDeserializer, TrackerFor, report_de_error};
2
3#[derive(Debug)]
4pub struct RepeatedVecTracker<T>(Vec<T>);
5
6impl<T> std::ops::Deref for RepeatedVecTracker<T> {
7    type Target = Vec<T>;
8
9    fn deref(&self) -> &Self::Target {
10        &self.0
11    }
12}
13
14impl<T> std::ops::DerefMut for RepeatedVecTracker<T> {
15    fn deref_mut(&mut self) -> &mut Self::Target {
16        &mut self.0
17    }
18}
19
20impl<T> Default for RepeatedVecTracker<T> {
21    fn default() -> Self {
22        Self(Default::default())
23    }
24}
25
26impl<T: Tracker> Tracker for RepeatedVecTracker<T> {
27    type Target = Vec<T::Target>;
28
29    #[inline(always)]
30    fn allow_duplicates(&self) -> bool {
31        false
32    }
33}
34
35impl<T: TrackerFor> TrackerFor for Vec<T> {
36    type Tracker = RepeatedVecTracker<T::Tracker>;
37}
38
39impl<'de, T> serde::de::DeserializeSeed<'de> for DeserializeHelper<'_, RepeatedVecTracker<T>>
40where
41    for<'a> DeserializeHelper<'a, T>: serde::de::DeserializeSeed<'de, Value = ()>,
42    T: Tracker + Default,
43    T::Target: Default,
44{
45    type Value = ();
46
47    fn deserialize<D>(self, de: D) -> Result<Self::Value, D::Error>
48    where
49        D: serde::Deserializer<'de>,
50    {
51        de.deserialize_seq(self)
52    }
53}
54
55impl<'de, T> serde::de::Visitor<'de> for DeserializeHelper<'_, RepeatedVecTracker<T>>
56where
57    for<'a> DeserializeHelper<'a, T>: serde::de::DeserializeSeed<'de, Value = ()>,
58    T: Tracker + Default,
59    T::Target: Default,
60{
61    type Value = ();
62
63    fn expecting(&self, formatter: &mut std::fmt::Formatter) -> std::fmt::Result {
64        Vec::<T::Target>::expecting(formatter)
65    }
66
67    fn visit_seq<A>(self, mut seq: A) -> Result<Self::Value, A::Error>
68    where
69        A: serde::de::SeqAccess<'de>,
70    {
71        let mut value = T::Target::default();
72        let mut tracker = T::default();
73
74        if let Some(size) = seq.size_hint() {
75            self.tracker.reserve(size);
76            self.value.reserve(size);
77        }
78
79        let mut index = 0;
80
81        loop {
82            let _token = SerdePathToken::push_index(index);
83
84            let Some(result) = seq
85                .next_element_seed(DeserializeHelper {
86                    value: &mut value,
87                    tracker: &mut tracker,
88                })
89                .transpose()
90            else {
91                break;
92            };
93
94            if let Err(error) = result {
95                report_de_error(error)?;
96                break;
97            }
98
99            self.value.push(std::mem::take(&mut value));
100            self.tracker.push(std::mem::take(&mut tracker));
101            index += 1;
102        }
103
104        Ok(())
105    }
106}
107
108impl<'de, T> TrackerDeserializer<'de> for RepeatedVecTracker<T>
109where
110    for<'a> DeserializeHelper<'a, T>: serde::de::DeserializeSeed<'de, Value = ()>,
111    T: Tracker + Default,
112    T::Target: Default,
113{
114    fn deserialize<D>(&mut self, value: &mut Self::Target, deserializer: D) -> Result<(), D::Error>
115    where
116        D: super::DeserializeContent<'de>,
117    {
118        deserializer.deserialize_seed(DeserializeHelper { value, tracker: self })
119    }
120}