use alloc::borrow::Cow;
use alloc::vec::Vec;
use core::fmt;
use core::ops::{Deref, DerefMut};
use crate::State;
use crate::de::{Deserialize, OwnedSink, Sink, SinkHandle};
use crate::error::Error;
use crate::event::{Atom, ContainerShape};
use crate::ser::{Begin, Chunk, Describe, Serialize};
#[derive(Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub struct Streamed<T> {
items: Vec<T>,
}
impl<T> Streamed<T> {
pub fn new() -> Streamed<T> {
Streamed { items: Vec::new() }
}
pub fn into_vec(self) -> Vec<T> {
self.items
}
}
impl<T> Default for Streamed<T> {
fn default() -> Streamed<T> {
Streamed::new()
}
}
impl<T: fmt::Debug> fmt::Debug for Streamed<T> {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
self.items.fmt(f)
}
}
impl<T> From<Vec<T>> for Streamed<T> {
fn from(items: Vec<T>) -> Streamed<T> {
Streamed { items }
}
}
impl<T> From<Streamed<T>> for Vec<T> {
fn from(value: Streamed<T>) -> Vec<T> {
value.items
}
}
impl<T> FromIterator<T> for Streamed<T> {
fn from_iter<I: IntoIterator<Item = T>>(iter: I) -> Streamed<T> {
Streamed {
items: iter.into_iter().collect(),
}
}
}
impl<T> IntoIterator for Streamed<T> {
type Item = T;
type IntoIter = alloc::vec::IntoIter<T>;
fn into_iter(self) -> Self::IntoIter {
self.items.into_iter()
}
}
impl<'a, T> IntoIterator for &'a Streamed<T> {
type Item = &'a T;
type IntoIter = core::slice::Iter<'a, T>;
fn into_iter(self) -> Self::IntoIter {
self.items.iter()
}
}
impl<T> Deref for Streamed<T> {
type Target = Vec<T>;
fn deref(&self) -> &Vec<T> {
&self.items
}
}
impl<T> DerefMut for Streamed<T> {
fn deref_mut(&mut self) -> &mut Vec<T> {
&mut self.items
}
}
impl<T: Serialize> Serialize for Streamed<T> {
fn serialize(&self, state: &mut State) -> Result<Chunk<'_>, Error> {
self.items.serialize(state)
}
fn finish(&self, state: &mut State) -> Result<(), Error> {
self.items.finish(state)
}
#[inline]
fn __private_begin(&self, state: &mut State) -> Result<Begin<'_>, Error> {
self.items.__private_begin(state)
}
fn container_shape(&self) -> ContainerShape {
self.items.container_shape()
}
fn describe(&self, d: &mut dyn Describe) {
self.items.describe(d)
}
}
fn complete<T: Send + 'static>(value: T, items: &mut Vec<T>, state: &State) {
let Err(value) = crate::stream::elements::hand_out(value, state) else {
return;
};
items.push(value);
}
impl<'de, T: Deserialize<'de> + 'static> Deserialize<'de> for Streamed<T> {
fn deserialize_into<'out>(
out: &'out mut Option<Self>,
state: &mut State,
) -> SinkHandle<'out, 'de> {
SinkHandle::arena(
StreamedSink {
out,
items: Vec::new(),
},
state,
)
}
}
struct StreamedSink<'a, T> {
out: &'a mut Option<Streamed<T>>,
items: Vec<T>,
}
impl<'a, 'de, T: Deserialize<'de> + 'static> Sink<'de> for StreamedSink<'a, T> {
fn expecting(&self) -> Cow<'_, str> {
Cow::Borrowed("sequence")
}
fn seq(&mut self, _state: &mut State) -> Result<(), Error> {
Ok(())
}
fn next_value(&mut self, state: &mut State) -> Result<SinkHandle<'_, 'de>, Error> {
Ok(SinkHandle::arena(
ElementSink {
sink: OwnedSink::deserialize(state),
items: &mut self.items,
},
state,
))
}
fn __private_value_atom(&mut self, atom: Atom, state: &mut State) -> Result<(), Error> {
let mut value = None;
T::__private_atom_into(&mut value, atom, state)?;
if let Some(value) = value {
complete(value, &mut self.items, state);
}
Ok(())
}
fn __private_borrowed_value_atom(
&mut self,
atom: Atom<'de>,
state: &mut State,
) -> Result<(), Error> {
let mut value = None;
T::__private_borrowed_atom_into(&mut value, atom, state)?;
if let Some(value) = value {
complete(value, &mut self.items, state);
}
Ok(())
}
fn finish(&mut self, _state: &mut State) -> Result<(), Error> {
*self.out = Some(Streamed {
items: core::mem::take(&mut self.items),
});
Ok(())
}
}
struct ElementSink<'a, 'de, T> {
sink: OwnedSink<'de, T>,
items: &'a mut Vec<T>,
}
impl<'a, 'de, T: Deserialize<'de> + 'static> Sink<'de> for ElementSink<'a, 'de, T> {
fn atom(&mut self, atom: Atom, state: &mut State) -> Result<(), Error> {
self.sink.borrow_mut().atom(atom, state)
}
fn borrowed_atom(&mut self, atom: Atom<'de>, state: &mut State) -> Result<(), Error> {
self.sink.borrow_mut().borrowed_atom(atom, state)
}
fn map(&mut self, state: &mut State) -> Result<(), Error> {
self.sink.borrow_mut().map(state)
}
fn seq(&mut self, state: &mut State) -> Result<(), Error> {
self.sink.borrow_mut().seq(state)
}
fn next_key(&mut self, state: &mut State) -> Result<SinkHandle<'_, 'de>, Error> {
self.sink.borrow_mut().next_key(state)
}
fn next_value(&mut self, state: &mut State) -> Result<SinkHandle<'_, 'de>, Error> {
self.sink.borrow_mut().next_value(state)
}
fn __private_key_atom(&mut self, atom: Atom, state: &mut State) -> Result<(), Error> {
self.sink.borrow_mut().__private_key_atom(atom, state)
}
fn __private_value_atom(&mut self, atom: Atom, state: &mut State) -> Result<(), Error> {
self.sink.borrow_mut().__private_value_atom(atom, state)
}
fn __private_borrowed_key_atom(
&mut self,
atom: Atom<'de>,
state: &mut State,
) -> Result<(), Error> {
self.sink
.borrow_mut()
.__private_borrowed_key_atom(atom, state)
}
fn __private_borrowed_value_atom(
&mut self,
atom: Atom<'de>,
state: &mut State,
) -> Result<(), Error> {
self.sink
.borrow_mut()
.__private_borrowed_value_atom(atom, state)
}
fn value_for_key(
&mut self,
key: &str,
state: &mut State,
) -> Result<Option<SinkHandle<'_, 'de>>, Error> {
self.sink.borrow_mut().value_for_key(key, state)
}
fn recover(&mut self, err: Error, state: &mut State) -> Result<(), Error> {
self.sink.borrow_mut().recover(err, state)
}
fn finish(&mut self, state: &mut State) -> Result<(), Error> {
self.sink.borrow_mut().finish(state)?;
if let Some(value) = self.sink.take() {
complete(value, self.items, state);
}
Ok(())
}
fn expecting(&self) -> Cow<'_, str> {
self.sink.borrow().expecting()
}
}