1use std::collections::{BTreeSet, HashMap, HashSet, LinkedList, VecDeque};
3use std::marker::PhantomData;
4
5use crate::de::{self, Visitor};
6use crate::ser::SerializeSeq;
7use crate::{de::SeqAccess, Deserialize, Deserializer};
8use crate::{Serialize, Serializer};
9use core::fmt;
10use std::iter::FromIterator;
11
12use super::utils::ValueOrWhitespace;
13
14pub trait IteratorVisitorMiddleware<T> {
16 type Output;
18
19 fn transform<I>(iter: I) -> Self::Output
21 where
22 I: IntoIterator<Item = T>;
23}
24
25impl<T, F: FromIterator<T>> IteratorVisitorMiddleware<T> for F {
26 type Output = F;
27 fn transform<I>(iter: I) -> Self::Output
28 where
29 I: IntoIterator<Item = T>,
30 {
31 F::from_iter(iter)
32 }
33}
34
35struct NoWhitespaceIter<T, O> {
36 _marker: PhantomData<(T, O)>,
37 result: O,
38}
39
40impl<'de, T: Deserialize<'de>, O: FromIterator<T>> FromIterator<ValueOrWhitespace<'de, T>>
41 for NoWhitespaceIter<T, O>
42{
43 fn from_iter<I: IntoIterator<Item = ValueOrWhitespace<'de, T>>>(iter: I) -> Self {
44 Self {
45 _marker: PhantomData,
46 result: O::from_iter(iter.into_iter().filter_map(|a| match a {
47 ValueOrWhitespace::Whitespace(_) => None,
48 ValueOrWhitespace::Value(a) => Some(a),
49 })),
50 }
51 }
52}
53
54impl<'de, T: Deserialize<'de>, O: FromIterator<T>> Deserialize<'de> for NoWhitespaceIter<T, O> {
55 fn deserialize<D: Deserializer<'de>>(reader: D) -> Result<Self, D::Error> {
56 reader.deserialize_seq(IteratorVisitor::<_, Self>::default())
57 }
58}
59
60pub struct IteratorVisitor<T, M> {
62 _marker: PhantomData<(T, M)>,
63}
64
65impl<T, M: IteratorVisitorMiddleware<T>> IteratorVisitor<T, M> {
66 pub fn new() -> Self {
68 Self {
69 _marker: PhantomData,
70 }
71 }
72}
73
74impl<T, M: IteratorVisitorMiddleware<T>> Default for IteratorVisitor<T, M> {
75 fn default() -> Self {
76 Self::new()
77 }
78}
79
80impl<'de, T, M> Visitor<'de> for IteratorVisitor<T, M>
81where
82 T: Deserialize<'de>,
83 M: IteratorVisitorMiddleware<T>,
84 M::Output: de::Deserialize<'de>,
85{
86 type Value = M::Output;
87
88 fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
89 write!(formatter, "a sequence of elements")
90 }
91
92 fn visit_seq<S>(self, mut seq: S) -> Result<Self::Value, S::Error>
93 where
94 S: SeqAccess<'de>,
95 {
96 Ok(M::transform(std::iter::from_fn(|| {
97 seq.next_element_seq::<T>().ok().flatten()
98 })))
99 }
100}
101
102fn serialize_seq<T, S>(iter: T, serializer: S) -> Result<S::Ok, S::Error>
103where
104 T: IntoIterator,
105 T::Item: Serialize,
106 S: Serializer,
107{
108 let mut seq = serializer.serialize_seq()?;
109 for element in iter {
110 seq.serialize_element(&element)?;
111 }
112 seq.end()
113}
114
115impl<T: Serialize> Serialize for &[T] {
116 fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
117 let mut seq = serializer.serialize_seq()?;
118 for item in self.iter() {
119 seq.serialize_element(item)?;
120 }
121
122 seq.end()
123 }
124}
125
126impl<'de, const N: usize, T: Deserialize<'de>> Deserialize<'de> for [T; N] {
128 fn deserialize<D: Deserializer<'de>>(reader: D) -> Result<Self, D::Error> {
129 struct LimitFromIter<const N: usize, T, O> {
130 _marker: PhantomData<(T, O)>,
131 result: O,
132 }
133
134 impl<'de, const N: usize, T: Deserialize<'de>, O: FromIterator<T>> FromIterator<T>
135 for LimitFromIter<N, T, O>
136 {
137 fn from_iter<I: IntoIterator<Item = T>>(iter: I) -> Self {
138 Self {
139 _marker: PhantomData,
140 result: O::from_iter(iter.into_iter().take(N)),
141 }
142 }
143 }
144
145 impl<'de, const N: usize, T: Deserialize<'de>, O: FromIterator<T>> Deserialize<'de>
146 for LimitFromIter<N, T, O>
147 {
148 fn deserialize<D: Deserializer<'de>>(reader: D) -> Result<Self, D::Error> {
149 reader.deserialize_seq(IteratorVisitor::<_, Self>::default())
150 }
151 }
152
153 let vec = reader.deserialize_seq(IteratorVisitor::<
154 ValueOrWhitespace<T>,
155 NoWhitespaceIter<T, LimitFromIter<N, T, Vec<T>>>,
156 >::new())?;
157
158 vec.result
159 .result
160 .try_into()
161 .map_err(|_| de::Error::missing_data())
162 }
163}
164
165impl<const N: usize, T: Serialize> Serialize for [T; N] {
166 fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
167 self.as_slice().serialize(serializer)
168 }
169}
170
171impl<'de, T: Deserialize<'de>> Deserialize<'de> for Vec<T> {
173 fn deserialize<D: Deserializer<'de>>(reader: D) -> Result<Self, D::Error> {
174 reader
175 .deserialize_seq(IteratorVisitor::<_, NoWhitespaceIter<_, Self>>::default())
176 .map(|a| a.result)
177 }
178}
179
180impl<T: Serialize> Serialize for Vec<T> {
181 fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
182 self.as_slice().serialize(serializer)
183 }
184}
185
186impl<'de, T: Deserialize<'de>> Deserialize<'de> for VecDeque<T> {
188 fn deserialize<D: Deserializer<'de>>(reader: D) -> Result<Self, D::Error> {
189 reader
190 .deserialize_seq(IteratorVisitor::<_, NoWhitespaceIter<_, Self>>::default())
191 .map(|a| a.result)
192 }
193}
194
195impl<T: Serialize> Serialize for VecDeque<T> {
196 fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
197 self.as_slices().0.serialize(serializer)
198 }
199}
200
201impl<'de, T: Deserialize<'de>> Deserialize<'de> for LinkedList<T> {
203 fn deserialize<D: Deserializer<'de>>(reader: D) -> Result<Self, D::Error> {
204 reader
205 .deserialize_seq(IteratorVisitor::<_, NoWhitespaceIter<_, Self>>::default())
206 .map(|a| a.result)
207 }
208}
209
210impl<T: Serialize> Serialize for LinkedList<T> {
211 fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
212 serialize_seq(self.iter(), serializer)
213 }
214}
215
216impl<'de, T: Deserialize<'de> + Eq + std::hash::Hash> Deserialize<'de> for HashSet<T> {
218 fn deserialize<D: Deserializer<'de>>(reader: D) -> Result<Self, D::Error> {
219 reader
220 .deserialize_seq(IteratorVisitor::<_, NoWhitespaceIter<_, Self>>::default())
221 .map(|a| a.result)
222 }
223}
224
225impl<T: Serialize> Serialize for HashSet<T> {
226 fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
227 serialize_seq(self.iter(), serializer)
228 }
229}
230
231impl<'de, T: Deserialize<'de> + Ord> Deserialize<'de> for BTreeSet<T> {
233 fn deserialize<D: Deserializer<'de>>(reader: D) -> Result<Self, D::Error> {
234 reader
235 .deserialize_seq(IteratorVisitor::<_, NoWhitespaceIter<_, Self>>::default())
236 .map(|a| a.result)
237 }
238}
239
240impl<T: Serialize> Serialize for BTreeSet<T> {
241 fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
242 serialize_seq(self.iter(), serializer)
243 }
244}
245
246impl<'de, K: Deserialize<'de> + Eq + std::hash::Hash, V: Deserialize<'de>> Deserialize<'de>
248 for HashMap<K, V>
249{
250 fn deserialize<D: Deserializer<'de>>(reader: D) -> Result<Self, D::Error> {
251 reader
252 .deserialize_seq(IteratorVisitor::<_, NoWhitespaceIter<_, Self>>::default())
253 .map(|a| a.result)
254 }
255}
256
257impl<K: Serialize, V: Serialize> Serialize for HashMap<K, V> {
258 fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
259 serialize_seq(self.iter(), serializer)
260 }
261}