use crate::core::delta::operation::OperationAttributes; use crate::core::delta::Operations; use serde::{ de::{SeqAccess, Visitor}, ser::SerializeSeq, Deserialize, Deserializer, Serialize, Serializer, }; use std::{fmt, marker::PhantomData}; impl Serialize for Operations where T: OperationAttributes + Serialize, { fn serialize(&self, serializer: S) -> Result where S: Serializer, { let mut seq = serializer.serialize_seq(Some(self.ops.len()))?; for op in self.ops.iter() { seq.serialize_element(op)?; } seq.end() } } impl<'de, T> Deserialize<'de> for Operations where T: OperationAttributes + Deserialize<'de>, { fn deserialize(deserializer: D) -> Result, D::Error> where D: Deserializer<'de>, { struct OperationSeqVisitor(PhantomData T>); impl<'de, T> Visitor<'de> for OperationSeqVisitor where T: OperationAttributes + Deserialize<'de>, { type Value = Operations; fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { formatter.write_str("a sequence") } #[inline] fn visit_seq(self, mut seq: A) -> Result where A: SeqAccess<'de>, { let mut o = Operations::default(); while let Some(op) = seq.next_element()? { o.add(op); } Ok(o) } } deserializer.deserialize_seq(OperationSeqVisitor(PhantomData)) } }