1use std::io;
2use std::io::Write;
3
4pub trait ToBytes<W>
6where
7 W: Write,
8{
9 fn to_bytes(&self, writer: &mut W) -> io::Result<()>;
11}
12
13impl<W> ToBytes<W> for u8
15where
16 W: Write,
17{
18 fn to_bytes(&self, writer: &mut W) -> io::Result<()> {
19 writer.write_all(&[*self])
20 }
21}
22
23impl<W> ToBytes<W> for u64
27where
28 W: Write,
29{
30 fn to_bytes(&self, writer: &mut W) -> io::Result<()> {
31 let mut value = *self;
32
33 loop {
35 if value < 0x80 {
36 writer.write_all(&[value as u8])?;
37
38 break;
39 }
40
41 writer.write_all(&[((value & 0x7f) | 0x80) as u8])?;
42 value >>= 7;
43 }
44
45 Ok(())
46 }
47}
48
49impl<W> ToBytes<W> for &str
53where
54 W: Write,
55{
56 fn to_bytes(&self, writer: &mut W) -> io::Result<()> {
57 writer.write_all(&[self.len() as u8])?;
59
60 writer.write_all(self.as_bytes())?;
62
63 Ok(())
64 }
65}
66
67impl<W> ToBytes<W> for String
71where
72 W: Write,
73{
74 fn to_bytes(&self, writer: &mut W) -> io::Result<()> {
75 writer.write_all(&[self.len() as u8])?;
77
78 writer.write_all(self.as_bytes())?;
80
81 Ok(())
82 }
83}
84
85impl<W, I> ToBytes<W> for Vec<I>
89where
90 W: Write,
91 I: ToBytes<W>,
92{
93 fn to_bytes(&self, writer: &mut W) -> io::Result<()> {
94 (self.len() as u64).to_bytes(writer)?;
96
97 for item in self {
99 item.to_bytes(writer)?;
100 }
101
102 Ok(())
103 }
104}