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}