use crate::*; use std::{cell::RefCell, fmt::Debug, rc::Rc}; use serde::{ser::SerializeSeq, Deserialize, Serialize}; #[derive(Clone)] pub struct ValueStream(pub Rc>>); impl ValueStream { pub fn into_string(self) -> String { format!( "[{}]", self.map(|x: Value| x.into_string()) .collect::>() .join(", ") ) } pub fn collect_string(self) -> String { self.map(|x: Value| x.collect_string()) .collect::>() .join("\n") } pub fn from_stream(input: impl Iterator + 'static) -> ValueStream { ValueStream(Rc::new(RefCell::new(input))) } } impl Debug for ValueStream { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { f.debug_struct("ValueStream").finish() } } impl Iterator for ValueStream { type Item = Value; fn next(&mut self) -> Option { { self.0.borrow_mut().next() } } } impl Serialize for ValueStream { fn serialize(&self, serializer: S) -> Result where S: serde::Serializer, { let mut seq = serializer.serialize_seq(None)?; for element in self.0.borrow_mut().into_iter() { seq.serialize_element(&element)?; } seq.end() } } impl<'de> Deserialize<'de> for ValueStream { fn deserialize(deserializer: D) -> Result where D: serde::Deserializer<'de>, { deserializer.deserialize_seq(MySeqVisitor) } } struct MySeqVisitor; impl<'a> serde::de::Visitor<'a> for MySeqVisitor { type Value = ValueStream; fn expecting(&self, formatter: &mut std::fmt::Formatter) -> std::fmt::Result { formatter.write_str("a value stream") } fn visit_seq(self, mut seq: A) -> Result where A: serde::de::SeqAccess<'a>, { let mut output: Vec = vec![]; while let Some(value) = seq.next_element()? { output.push(value); } Ok(ValueStream(Rc::new(RefCell::new(output.into_iter())))) } } pub trait IntoValueStream { fn into_value_stream(self) -> ValueStream; } impl IntoValueStream for T where T: Iterator + 'static, { fn into_value_stream(self) -> ValueStream { ValueStream::from_stream(self) } }