1use crate::{Error, Result, Vec, compact::vlen};
4use serde::ser;
5
6#[derive(Default)]
8pub struct Serializer {
9 pub output: Vec<u8>,
11}
12
13impl ser::Serializer for &mut Serializer {
14 type Ok = ();
15 type Error = Error;
16
17 type SerializeSeq = Self;
18 type SerializeTuple = Self;
19 type SerializeTupleStruct = Self;
20 type SerializeTupleVariant = Self;
21 type SerializeMap = Self;
22 type SerializeStruct = Self;
23 type SerializeStructVariant = Self;
24
25 fn serialize_bool(self, v: bool) -> Result<()> {
26 if v {
27 self.output.push(1);
28 } else {
29 self.output.push(0);
30 }
31 Ok(())
32 }
33
34 fn serialize_i8(self, v: i8) -> Result<()> {
35 self.output.extend_from_slice(&[v as u8]);
36 Ok(())
37 }
38
39 fn serialize_u8(self, v: u8) -> Result<()> {
40 self.output.push(v);
41 Ok(())
42 }
43
44 fn serialize_i16(self, v: i16) -> Result<()> {
45 self.output.extend_from_slice(&v.to_le_bytes());
46 Ok(())
47 }
48
49 fn serialize_u16(self, v: u16) -> Result<()> {
50 self.output.extend_from_slice(&v.to_le_bytes());
51 Ok(())
52 }
53
54 fn serialize_i32(self, v: i32) -> Result<()> {
55 self.output.extend_from_slice(&v.to_le_bytes());
56 Ok(())
57 }
58
59 fn serialize_u32(self, v: u32) -> Result<()> {
60 self.output.extend_from_slice(&v.to_le_bytes());
61 Ok(())
62 }
63
64 fn serialize_i64(self, v: i64) -> Result<()> {
65 self.output.extend_from_slice(&v.to_le_bytes());
66 Ok(())
67 }
68
69 fn serialize_u64(self, v: u64) -> Result<()> {
70 self.output.extend_from_slice(&v.to_le_bytes());
71 Ok(())
72 }
73
74 fn serialize_f32(self, v: f32) -> Result<()> {
75 self.output.extend_from_slice(&v.to_le_bytes());
76 Ok(())
77 }
78
79 fn serialize_f64(self, v: f64) -> Result<()> {
80 self.output.extend_from_slice(&v.to_le_bytes());
81 Ok(())
82 }
83
84 fn serialize_str(self, v: &str) -> Result<()> {
85 let length = vlen::encode(v.len() as u64);
87 self.output.extend_from_slice(&length);
88 self.output.extend_from_slice(v.as_bytes());
89 Ok(())
90 }
91
92 fn serialize_bytes(self, v: &[u8]) -> Result<()> {
93 self.output.extend_from_slice(v);
94 Ok(())
95 }
96
97 fn serialize_char(self, v: char) -> Result<()> {
98 self.output.push(v as u8);
99 Ok(())
100 }
101
102 fn serialize_none(self) -> Result<()> {
103 self.output.push(0);
104 Ok(())
105 }
106
107 fn serialize_some<T>(self, value: &T) -> Result<()>
108 where
109 T: ser::Serialize + ?Sized,
110 {
111 self.output.push(1);
112 value.serialize(self)
113 }
114
115 fn serialize_unit(self) -> Result<()> {
116 Err(anyhow::anyhow!("Unit not supported").into())
117 }
118
119 fn serialize_unit_variant(
120 self,
121 _name: &'static str,
122 variant_index: u32,
123 _variant: &'static str,
124 ) -> Result<()> {
125 if variant_index > 0xff {
126 return Err(anyhow::anyhow!("Variant index too large").into());
127 }
128 self.serialize_u8(variant_index as u8)
129 }
130
131 fn serialize_newtype_struct<T>(self, _name: &'static str, _value: &T) -> Result<()>
132 where
133 T: ser::Serialize + ?Sized,
134 {
135 Err(anyhow::anyhow!("Newtype struct not supported").into())
136 }
137
138 fn collect_map<K, V, I>(self, iter: I) -> Result<()>
139 where
140 K: ser::Serialize,
141 V: ser::Serialize,
142 I: IntoIterator<Item = (K, V)>,
143 {
144 let iter = iter.into_iter();
145 let len = iter.size_hint().0;
146 let length = vlen::encode(len as u64);
147 self.output.extend_from_slice(&length);
148
149 for (key, value) in iter {
150 key.serialize(&mut *self)?;
151 value.serialize(&mut *self)?;
152 }
153 Ok(())
154 }
155
156 fn serialize_seq(self, len: Option<usize>) -> Result<Self::SerializeSeq> {
157 if let Some(len) = len {
158 let length = vlen::encode(len as u64);
159 self.output.extend_from_slice(&length);
160 }
161 Ok(self)
162 }
163
164 fn serialize_tuple(self, _len: usize) -> Result<Self::SerializeTuple> {
165 Ok(self)
166 }
167
168 fn serialize_tuple_struct(
169 self,
170 _name: &'static str,
171 _len: usize,
172 ) -> Result<Self::SerializeTupleStruct> {
173 Err(anyhow::anyhow!("Tuple struct not supported").into())
174 }
175
176 fn serialize_tuple_variant(
177 self,
178 _name: &'static str,
179 variant_index: u32,
180 _variant: &'static str,
181 _len: usize,
182 ) -> Result<Self::SerializeTupleVariant> {
183 if variant_index > 0xff {
184 return Err(anyhow::anyhow!("Variant index too large").into());
185 }
186 self.serialize_u8(variant_index as u8)?;
187 Ok(self)
188 }
189
190 fn serialize_map(self, len: Option<usize>) -> Result<Self::SerializeMap> {
191 if let Some(len) = len {
192 let length = vlen::encode(len as u64);
193 self.output.extend_from_slice(&length);
194 }
195 Ok(self)
196 }
197
198 fn serialize_struct(self, _name: &'static str, _len: usize) -> Result<Self::SerializeStruct> {
199 Ok(self)
200 }
201
202 fn serialize_struct_variant(
203 self,
204 _name: &'static str,
205 variant_index: u32,
206 _variant: &'static str,
207 _len: usize,
208 ) -> Result<Self::SerializeStructVariant> {
209 if variant_index > 0xff {
210 return Err(anyhow::anyhow!("Variant index too large").into());
211 }
212 self.serialize_u8(variant_index as u8)?;
213 Ok(self)
214 }
215
216 fn serialize_unit_struct(self, _name: &'static str) -> Result<()> {
217 self.serialize_unit()
218 }
219
220 fn serialize_newtype_variant<T: ?Sized + ser::Serialize>(
221 self,
222 _name: &'static str,
223 _variant_index: u32,
224 _variant: &'static str,
225 value: &T,
226 ) -> Result<()> {
227 if _variant_index > 0xff {
228 return Err(anyhow::anyhow!("Variant index too large").into());
229 }
230 self.serialize_u8(_variant_index as u8)?;
231 value.serialize(self)
232 }
233
234 fn collect_str<T>(self, _value: &T) -> Result<()>
235 where
236 T: ?Sized + core::fmt::Display,
237 {
238 Err(anyhow::anyhow!("Str not supported").into())
239 }
240
241 fn serialize_i128(self, v: i128) -> Result<()> {
242 self.output.extend_from_slice(&v.to_le_bytes());
243 Ok(())
244 }
245
246 fn serialize_u128(self, v: u128) -> Result<()> {
247 self.output.extend_from_slice(&v.to_le_bytes());
248 Ok(())
249 }
250
251 fn is_human_readable(&self) -> bool {
252 false
253 }
254}
255
256impl ser::SerializeSeq for &mut Serializer {
257 type Ok = ();
258 type Error = Error;
259
260 fn serialize_element<T>(&mut self, value: &T) -> Result<()>
262 where
263 T: ?Sized + ser::Serialize,
264 {
265 value.serialize(&mut **self)?;
266 Ok(())
267 }
268
269 fn end(self) -> Result<()> {
271 Ok(())
272 }
273}
274
275impl ser::SerializeTuple for &mut Serializer {
276 type Ok = ();
277 type Error = Error;
278
279 fn serialize_element<T>(&mut self, value: &T) -> Result<()>
280 where
281 T: ?Sized + ser::Serialize,
282 {
283 value.serialize(&mut **self)?;
284 Ok(())
285 }
286
287 fn end(self) -> Result<()> {
288 Ok(())
289 }
290}
291
292impl ser::SerializeTupleStruct for &mut Serializer {
293 type Ok = ();
294 type Error = Error;
295
296 fn serialize_field<T>(&mut self, _value: &T) -> Result<()>
297 where
298 T: ?Sized + ser::Serialize,
299 {
300 Err(anyhow::anyhow!("Tuple struct not supported").into())
301 }
302
303 fn end(self) -> Result<()> {
304 Ok(())
305 }
306}
307
308impl ser::SerializeTupleVariant for &mut Serializer {
309 type Ok = ();
310 type Error = Error;
311
312 fn serialize_field<T>(&mut self, value: &T) -> Result<()>
313 where
314 T: ?Sized + ser::Serialize,
315 {
316 value.serialize(&mut **self)
317 }
318
319 fn end(self) -> Result<()> {
320 Ok(())
321 }
322}
323
324impl ser::SerializeMap for &mut Serializer {
325 type Ok = ();
326 type Error = Error;
327
328 fn serialize_key<T>(&mut self, key: &T) -> Result<()>
329 where
330 T: ?Sized + ser::Serialize,
331 {
332 key.serialize(&mut **self)
333 }
334
335 fn serialize_value<T>(&mut self, value: &T) -> Result<()>
336 where
337 T: ?Sized + ser::Serialize,
338 {
339 value.serialize(&mut **self)
340 }
341
342 fn end(self) -> Result<()> {
343 Ok(())
344 }
345}
346
347impl ser::SerializeStruct for &mut Serializer {
348 type Ok = ();
349 type Error = Error;
350
351 fn serialize_field<T>(&mut self, _key: &'static str, value: &T) -> Result<()>
352 where
353 T: ?Sized + ser::Serialize,
354 {
355 value.serialize(&mut **self)?;
356 Ok(())
357 }
358
359 fn end(self) -> Result<()> {
360 Ok(())
361 }
362}
363
364impl ser::SerializeStructVariant for &mut Serializer {
365 type Ok = ();
366 type Error = Error;
367
368 fn serialize_field<T>(&mut self, _key: &'static str, value: &T) -> Result<()>
369 where
370 T: ?Sized + ser::Serialize,
371 {
372 value.serialize(&mut **self)
373 }
374
375 fn end(self) -> Result<()> {
376 Ok(())
377 }
378}