1use alloc::borrow::Cow;
2use alloc::vec::Vec;
3use core::fmt;
4use core::ops::{Deref, DerefMut};
5
6use crate::State;
7use crate::de::{Deserialize, OwnedSink, Sink, SinkHandle};
8use crate::error::Error;
9use crate::event::{Atom, ContainerShape};
10use crate::ser::{Begin, Describe, Emit, Serialize};
11
12#[derive(Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
78pub struct Streamed<T> {
79 items: Vec<T>,
80}
81
82impl<T> Streamed<T> {
83 pub fn new() -> Streamed<T> {
85 Streamed { items: Vec::new() }
86 }
87
88 pub fn into_vec(self) -> Vec<T> {
90 self.items
91 }
92}
93
94impl<T> Default for Streamed<T> {
95 fn default() -> Streamed<T> {
96 Streamed::new()
97 }
98}
99
100impl<T: fmt::Debug> fmt::Debug for Streamed<T> {
101 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
102 self.items.fmt(f)
103 }
104}
105
106impl<T> From<Vec<T>> for Streamed<T> {
107 fn from(items: Vec<T>) -> Streamed<T> {
108 Streamed { items }
109 }
110}
111
112impl<T> From<Streamed<T>> for Vec<T> {
113 fn from(value: Streamed<T>) -> Vec<T> {
114 value.items
115 }
116}
117
118impl<T> FromIterator<T> for Streamed<T> {
119 fn from_iter<I: IntoIterator<Item = T>>(iter: I) -> Streamed<T> {
120 Streamed {
121 items: iter.into_iter().collect(),
122 }
123 }
124}
125
126impl<T> IntoIterator for Streamed<T> {
127 type Item = T;
128 type IntoIter = alloc::vec::IntoIter<T>;
129
130 fn into_iter(self) -> Self::IntoIter {
131 self.items.into_iter()
132 }
133}
134
135impl<'a, T> IntoIterator for &'a Streamed<T> {
136 type Item = &'a T;
137 type IntoIter = core::slice::Iter<'a, T>;
138
139 fn into_iter(self) -> Self::IntoIter {
140 self.items.iter()
141 }
142}
143
144impl<T> Deref for Streamed<T> {
145 type Target = Vec<T>;
146
147 fn deref(&self) -> &Vec<T> {
148 &self.items
149 }
150}
151
152impl<T> DerefMut for Streamed<T> {
153 fn deref_mut(&mut self) -> &mut Vec<T> {
154 &mut self.items
155 }
156}
157
158impl<T: Serialize> Serialize for Streamed<T> {
159 fn serialize<'a>(value: &'a Self, state: &mut State) -> Result<Emit<'a>, Error> {
160 Vec::<T>::serialize(&value.items, state)
161 }
162
163 fn finish(value: &Self, state: &mut State) -> Result<(), Error> {
164 Vec::<T>::finish(&value.items, state)
165 }
166
167 #[inline]
168 fn __private_begin<'a>(value: &'a Self, state: &mut State) -> Result<Begin<'a>, Error> {
169 Vec::<T>::__private_begin(&value.items, state)
170 }
171
172 fn container_shape(value: &Self) -> ContainerShape {
173 Vec::<T>::container_shape(&value.items)
174 }
175
176 fn describe(value: &Self, d: &mut dyn Describe) {
177 Vec::<T>::describe(&value.items, d)
178 }
179}
180
181fn complete<T: Send + 'static>(value: T, items: &mut Vec<T>, state: &State) {
183 let Err(value) = crate::stream::elements::hand_out(value, state) else {
184 return;
185 };
186 items.push(value);
187}
188
189const STREAMED_NAME: &str = "sequence";
191
192impl<'de, T: Deserialize<'de> + 'static> Deserialize<'de> for Streamed<T> {
193 fn deserialize_into<'out>(
194 out: &'out mut Option<Self>,
195 state: &mut State,
196 ) -> SinkHandle<'out, 'de> {
197 SinkHandle::arena(
198 StreamedSink {
199 out,
200 items: Vec::new(),
201 },
202 state,
203 )
204 }
205
206 fn expecting() -> Cow<'static, str> {
207 Cow::Borrowed(STREAMED_NAME)
208 }
209}
210
211struct StreamedSink<'a, T> {
212 out: &'a mut Option<Streamed<T>>,
213 items: Vec<T>,
214}
215
216impl<'a, 'de, T: Deserialize<'de> + 'static> Sink<'de> for StreamedSink<'a, T> {
217 fn expecting(&self) -> Cow<'_, str> {
218 Cow::Borrowed(STREAMED_NAME)
219 }
220
221 fn seq(&mut self, _state: &mut State) -> Result<(), Error> {
222 Ok(())
223 }
224
225 fn next_value(&mut self, state: &mut State) -> Result<SinkHandle<'_, 'de>, Error> {
226 Ok(SinkHandle::arena(
227 ElementSink {
228 sink: OwnedSink::deserialize(state),
229 items: &mut self.items,
230 },
231 state,
232 ))
233 }
234
235 fn __private_value_atom(&mut self, atom: Atom, state: &mut State) -> Result<(), Error> {
236 let mut value = None;
237 T::__private_atom_into(&mut value, atom, state)?;
238 if let Some(value) = value {
239 complete(value, &mut self.items, state);
240 }
241 Ok(())
242 }
243
244 fn __private_borrowed_value_atom(
245 &mut self,
246 atom: Atom<'de>,
247 state: &mut State,
248 ) -> Result<(), Error> {
249 let mut value = None;
250 T::__private_borrowed_atom_into(&mut value, atom, state)?;
251 if let Some(value) = value {
252 complete(value, &mut self.items, state);
253 }
254 Ok(())
255 }
256
257 fn finish(&mut self, _state: &mut State) -> Result<(), Error> {
258 *self.out = Some(Streamed {
259 items: core::mem::take(&mut self.items),
260 });
261 Ok(())
262 }
263}
264
265struct ElementSink<'a, 'de, T> {
267 sink: OwnedSink<'de, T>,
268 items: &'a mut Vec<T>,
269}
270
271impl<'a, 'de, T: Deserialize<'de> + 'static> Sink<'de> for ElementSink<'a, 'de, T> {
272 fn atom(&mut self, atom: Atom, state: &mut State) -> Result<(), Error> {
273 self.sink.get_mut().atom(atom, state)
274 }
275
276 fn borrowed_atom(&mut self, atom: Atom<'de>, state: &mut State) -> Result<(), Error> {
277 self.sink.get_mut().borrowed_atom(atom, state)
278 }
279
280 fn map(&mut self, state: &mut State) -> Result<(), Error> {
281 self.sink.get_mut().map(state)
282 }
283
284 fn seq(&mut self, state: &mut State) -> Result<(), Error> {
285 self.sink.get_mut().seq(state)
286 }
287
288 forward_to_owned!(sink);
289
290 fn finish(&mut self, state: &mut State) -> Result<(), Error> {
291 self.sink.get_mut().finish(state)?;
292 if let Some(value) = self.sink.take() {
293 complete(value, self.items, state);
294 }
295 Ok(())
296 }
297}