ferogram_tl_types/
serialize.rs1pub trait Serializable {
20 fn serialize(&self, buf: &mut impl Extend<u8>);
22
23 fn to_bytes(&self) -> Vec<u8> {
25 let mut v = Vec::new();
26 self.serialize(&mut v);
27 v
28 }
29}
30
31impl Serializable for bool {
36 fn serialize(&self, buf: &mut impl Extend<u8>) {
37 let id: u32 = if *self { 0x997275b5 } else { 0xbc799737 };
38 id.serialize(buf);
39 }
40}
41
42impl Serializable for i32 {
45 fn serialize(&self, buf: &mut impl Extend<u8>) {
46 buf.extend(self.to_le_bytes());
47 }
48}
49
50impl Serializable for u32 {
51 fn serialize(&self, buf: &mut impl Extend<u8>) {
52 buf.extend(self.to_le_bytes());
53 }
54}
55
56impl Serializable for i64 {
57 fn serialize(&self, buf: &mut impl Extend<u8>) {
58 buf.extend(self.to_le_bytes());
59 }
60}
61
62impl Serializable for f64 {
63 fn serialize(&self, buf: &mut impl Extend<u8>) {
64 buf.extend(self.to_le_bytes());
65 }
66}
67
68impl Serializable for [u8; 16] {
69 fn serialize(&self, buf: &mut impl Extend<u8>) {
70 buf.extend(self.iter().copied());
71 }
72}
73
74impl Serializable for [u8; 32] {
75 fn serialize(&self, buf: &mut impl Extend<u8>) {
76 buf.extend(self.iter().copied());
77 }
78}
79
80impl Serializable for &[u8] {
87 fn serialize(&self, buf: &mut impl Extend<u8>) {
88 let len = self.len();
89 let (header_len, header): (usize, Vec<u8>) = if len <= 253 {
90 (1, vec![len as u8])
91 } else {
92 (
93 4,
94 vec![
95 0xfe,
96 (len & 0xff) as u8,
97 ((len >> 8) & 0xff) as u8,
98 ((len >> 16) & 0xff) as u8,
99 ],
100 )
101 };
102
103 let total = header_len + len;
104 let padding = (4 - (total % 4)) % 4;
105
106 buf.extend(header);
107 buf.extend(self.iter().copied());
108 buf.extend(std::iter::repeat_n(0u8, padding));
109 }
110}
111
112impl Serializable for Vec<u8> {
113 fn serialize(&self, buf: &mut impl Extend<u8>) {
114 self.as_slice().serialize(buf);
115 }
116}
117
118impl Serializable for String {
119 fn serialize(&self, buf: &mut impl Extend<u8>) {
120 self.as_bytes().serialize(buf);
121 }
122}
123
124impl<T: Serializable> Serializable for Vec<T> {
128 fn serialize(&self, buf: &mut impl Extend<u8>) {
129 0x1cb5c415u32.serialize(buf);
130 (self.len() as i32).serialize(buf);
131 for item in self {
132 item.serialize(buf);
133 }
134 }
135}
136
137impl<T: Serializable> Serializable for crate::RawVec<T> {
139 fn serialize(&self, buf: &mut impl Extend<u8>) {
140 (self.0.len() as i32).serialize(buf);
141 for item in &self.0 {
142 item.serialize(buf);
143 }
144 }
145}
146
147impl<T: Serializable> Serializable for Option<T> {
152 fn serialize(&self, buf: &mut impl Extend<u8>) {
153 if let Some(v) = self {
154 v.serialize(buf);
155 }
156 }
157}