nvbit_io/
lib.rs

1use serde::ser::SerializeSeq;
2
3/// An encoder to serialize a stream of packets.
4#[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    /// Creates a new encoder for a `serde::Serializer`.
17    ///
18    /// # Errors
19    /// If the serializer cannot start a new sequence.
20    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    /// Finalizes the sequence.
29    ///
30    /// This will terminate the sequence and consume the encoder.
31    ///
32    /// # Errors
33    /// If there is no sequence to terminate (this should never happen).
34    pub fn finalize(self) -> Result<Seq::Ok, Seq::Error> {
35        self.seq.end()
36    }
37
38    /// Encode a single value as a sequence element.
39    ///
40    /// # Errors
41    /// If the element cannot be serialized using `SerializeSeq`,
42    /// an error is returned.
43    pub fn encode<V>(&mut self, value: impl serde::Serialize) -> Result<(), Seq::Error> {
44        self.seq.serialize_element(&value)
45    }
46}
47
48/// A decoder to deserialize a stream of packets.
49#[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}