ferogram_tl_types/
serialize.rs1pub trait Serializable {
16 fn serialize(&self, buf: &mut impl Extend<u8>);
18
19 fn to_bytes(&self) -> Vec<u8> {
21 let mut v = Vec::new();
22 self.serialize(&mut v);
23 v
24 }
25}
26
27impl Serializable for bool {
32 fn serialize(&self, buf: &mut impl Extend<u8>) {
33 let id: u32 = if *self { 0x997275b5 } else { 0xbc799737 };
34 id.serialize(buf);
35 }
36}
37
38impl Serializable for i32 {
41 fn serialize(&self, buf: &mut impl Extend<u8>) {
42 buf.extend(self.to_le_bytes());
43 }
44}
45
46impl Serializable for u32 {
47 fn serialize(&self, buf: &mut impl Extend<u8>) {
48 buf.extend(self.to_le_bytes());
49 }
50}
51
52impl Serializable for i64 {
53 fn serialize(&self, buf: &mut impl Extend<u8>) {
54 buf.extend(self.to_le_bytes());
55 }
56}
57
58impl Serializable for f64 {
59 fn serialize(&self, buf: &mut impl Extend<u8>) {
60 buf.extend(self.to_le_bytes());
61 }
62}
63
64impl Serializable for [u8; 16] {
65 fn serialize(&self, buf: &mut impl Extend<u8>) {
66 buf.extend(self.iter().copied());
67 }
68}
69
70impl Serializable for [u8; 32] {
71 fn serialize(&self, buf: &mut impl Extend<u8>) {
72 buf.extend(self.iter().copied());
73 }
74}
75
76impl Serializable for &[u8] {
83 fn serialize(&self, buf: &mut impl Extend<u8>) {
84 let len = self.len();
85 let (header_len, header): (usize, Vec<u8>) = if len <= 253 {
86 (1, vec![len as u8])
87 } else {
88 (
89 4,
90 vec![
91 0xfe,
92 (len & 0xff) as u8,
93 ((len >> 8) & 0xff) as u8,
94 ((len >> 16) & 0xff) as u8,
95 ],
96 )
97 };
98
99 let total = header_len + len;
100 let padding = (4 - (total % 4)) % 4;
101
102 buf.extend(header);
103 buf.extend(self.iter().copied());
104 buf.extend(std::iter::repeat_n(0u8, padding));
105 }
106}
107
108impl Serializable for Vec<u8> {
109 fn serialize(&self, buf: &mut impl Extend<u8>) {
110 self.as_slice().serialize(buf);
111 }
112}
113
114impl Serializable for String {
115 fn serialize(&self, buf: &mut impl Extend<u8>) {
116 self.as_bytes().serialize(buf);
117 }
118}
119
120impl<T: Serializable> Serializable for Vec<T> {
124 fn serialize(&self, buf: &mut impl Extend<u8>) {
125 0x1cb5c415u32.serialize(buf);
126 (self.len() as i32).serialize(buf);
127 for item in self {
128 item.serialize(buf);
129 }
130 }
131}
132
133impl<T: Serializable> Serializable for crate::RawVec<T> {
135 fn serialize(&self, buf: &mut impl Extend<u8>) {
136 (self.0.len() as i32).serialize(buf);
137 for item in &self.0 {
138 item.serialize(buf);
139 }
140 }
141}
142
143impl<T: Serializable> Serializable for Option<T> {
148 fn serialize(&self, buf: &mut impl Extend<u8>) {
149 if let Some(v) = self {
150 v.serialize(buf);
151 }
152 }
153}