1use serde::ser::SerializeSeq;
2
3#[derive(Debug, Clone)]
5pub struct Encoder<Seq>
6where
7 Seq: SerializeSeq,
8{
9 pub seq: Seq,
10}
11
12impl<Seq> Encoder<Seq>
13where
14 Seq: SerializeSeq,
15{
16 pub fn new<S>(serializer: S) -> Result<Self, S::Error>
21 where
22 S: serde::Serializer<SerializeSeq = Seq>,
23 {
24 let seq = serializer.serialize_seq(None)?;
25 Ok(Self { seq })
26 }
27
28 pub fn finalize(self) -> Result<Seq::Ok, Seq::Error> {
35 self.seq.end()
36 }
37
38 pub fn encode<V>(&mut self, value: impl serde::Serialize) -> Result<(), Seq::Error> {
44 self.seq.serialize_element(&value)
45 }
46}
47
48#[derive(Debug, Clone)]
50pub struct Decoder<T, CB> {
51 callback: CB,
52 phantom: std::marker::PhantomData<T>,
53}
54
55impl<T, CB> Decoder<T, CB> {
56 pub fn new(callback: CB) -> Self {
57 Self {
58 callback,
59 phantom: std::marker::PhantomData,
60 }
61 }
62}
63
64impl<'de, T, CB> serde::de::Visitor<'de> for Decoder<T, CB>
65where
66 T: serde::Deserialize<'de>,
67 CB: FnMut(T),
68{
69 type Value = ();
70
71 fn expecting(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
72 f.write_str("array of packets")
73 }
74
75 fn visit_seq<A>(mut self, mut seq: A) -> Result<Self::Value, A::Error>
76 where
77 A: serde::de::SeqAccess<'de>,
78 {
79 while let Some(item) = seq.next_element::<T>()? {
80 (self.callback)(item);
81 }
82 Ok(())
83 }
84}
85
86#[cfg(test)]
87mod tests {
88 use super::{Decoder, Encoder};
89 use anyhow::Result;
90 use serde::Deserializer;
91 use std::io::{BufReader, BufWriter, Cursor};
92
93 #[test]
94 fn json() -> Result<()> {
95 let mut writer = BufWriter::new(Vec::new());
96 let mut serializer = serde_json::Serializer::new(&mut writer);
97 let mut encoder = Encoder::new(&mut serializer)?;
98 encoder.encode::<u32>(1)?;
99 encoder.encode::<u32>(2)?;
100 encoder.encode::<u32>(3)?;
101 encoder.finalize()?;
102
103 let buf = writer.into_inner()?;
104 let result = std::str::from_utf8(&buf)?;
105 assert_eq!(result, "[1,2,3]");
106
107 let mut values: Vec<u32> = Vec::new();
108 let reader = BufReader::new(Cursor::new(buf));
109 let mut deserializer = serde_json::Deserializer::from_reader(reader);
110 let decoder = Decoder::new(|value| values.push(value));
111 deserializer.deserialize_seq(decoder)?;
112
113 assert_eq!(values, [1, 2, 3]);
114 Ok(())
115 }
116
117 #[test]
118 fn messagepack() -> Result<()> {
119 let buf = Vec::new();
120 let mut writer = BufWriter::new(buf);
121 let mut serializer = rmp_serde::Serializer::new(&mut writer);
122 let mut encoder = Encoder::new(&mut serializer)?;
123 encoder.encode::<u32>(1)?;
124 encoder.encode::<u32>(2)?;
125 encoder.encode::<u32>(3)?;
126 encoder.finalize()?;
127
128 let mut values: Vec<u32> = Vec::new();
129 let reader = BufReader::new(Cursor::new(writer.into_inner()?));
130 let mut deserializer = rmp_serde::Deserializer::new(reader);
131 let decoder = Decoder::new(|value| values.push(value));
132 deserializer.deserialize_seq(decoder)?;
133
134 assert_eq!(values, [1, 2, 3]);
135 Ok(())
136 }
137}