zusi_protocol/ser/
mod.rs

1use std::io::Write;
2
3use crate::Result;
4
5mod num;
6
7/// Serializes a Node or Attribute to an io::Writer.
8pub trait Serialize {
9    fn serialize<W>(&self, writer: &mut W, id: u16) -> Result<()>
10    where
11        W: Write;
12}
13
14impl<T> Serialize for Option<T>
15where
16    T: Serialize,
17{
18    fn serialize<W>(&self, writer: &mut W, id: u16) -> Result<()>
19    where
20        W: Write,
21    {
22        if let Some(s) = &self {
23            s.serialize(writer, id)?;
24        }
25
26        Ok(())
27    }
28}
29
30impl<T> Serialize for Vec<T>
31where
32    T: Serialize,
33{
34    fn serialize<W>(&self, writer: &mut W, id: u16) -> Result<()>
35    where
36        W: Write,
37    {
38        for elem in self {
39            elem.serialize(writer, id)?;
40        }
41
42        Ok(())
43    }
44}
45
46impl Serialize for String {
47    fn serialize<W>(&self, writer: &mut W, id: u16) -> Result<()>
48    where
49        W: Write,
50    {
51        self.as_str().serialize(writer, id)
52    }
53}
54
55impl Serialize for &str {
56    fn serialize<W>(&self, writer: &mut W, id: u16) -> Result<()>
57    where
58        W: Write,
59    {
60        let len = self.len() as u32 + 2;
61
62        writer.write_all(&len.to_le_bytes())?;
63        writer.write_all(&id.to_le_bytes())?;
64        writer.write_all(self.as_bytes())?;
65
66        Ok(())
67    }
68}
69
70pub fn write_node_header<W>(writer: &mut W, id: u16) -> Result<()>
71where
72    W: Write,
73{
74    writer.write_all(&crate::NODE_START)?;
75    writer.write_all(&id.to_le_bytes())?;
76
77    Ok(())
78}
79
80pub fn write_node_end<W>(writer: &mut W) -> Result<()>
81where
82    W: Write,
83{
84    writer.write_all(&crate::NODE_END)?;
85
86    Ok(())
87}
88
89#[cfg(test)]
90mod tests {
91    use crate::to_bytes;
92
93    #[test]
94    fn test_string() {
95        let input = "Bla".to_string();
96
97        let expected: Vec<u8> = vec![5, 0, 0, 0, 1, 0, 66, 108, 97];
98
99        assert_eq!(to_bytes(&input).unwrap(), expected);
100    }
101
102    #[test]
103    fn test_str() {
104        let input = "Bla";
105
106        let expected: Vec<u8> = vec![5, 0, 0, 0, 1, 0, 66, 108, 97];
107
108        assert_eq!(to_bytes(&input).unwrap(), expected);
109    }
110}