delta_serde.rs 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. use crate::core::Delta;
  2. use serde::{
  3. de::{SeqAccess, Visitor},
  4. ser::SerializeSeq,
  5. Deserialize,
  6. Deserializer,
  7. Serialize,
  8. Serializer,
  9. };
  10. use std::fmt;
  11. impl Serialize for Delta {
  12. fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
  13. where
  14. S: Serializer,
  15. {
  16. let mut seq = serializer.serialize_seq(Some(self.ops.len()))?;
  17. for op in self.ops.iter() {
  18. seq.serialize_element(op)?;
  19. }
  20. seq.end()
  21. }
  22. }
  23. impl<'de> Deserialize<'de> for Delta {
  24. fn deserialize<D>(deserializer: D) -> Result<Delta, D::Error>
  25. where
  26. D: Deserializer<'de>,
  27. {
  28. struct OperationSeqVisitor;
  29. impl<'de> Visitor<'de> for OperationSeqVisitor {
  30. type Value = Delta;
  31. fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { formatter.write_str("a sequence") }
  32. fn visit_seq<A>(self, mut seq: A) -> Result<Self::Value, A::Error>
  33. where
  34. A: SeqAccess<'de>,
  35. {
  36. let mut o = Delta::default();
  37. while let Some(op) = seq.next_element()? {
  38. o.add(op);
  39. }
  40. Ok(o)
  41. }
  42. }
  43. deserializer.deserialize_seq(OperationSeqVisitor)
  44. }
  45. }