1use std::io::Write;
2
3use crate::Result;
4
5mod num;
6
7pub 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}