1use bitvec::{prelude as bv, slice::BitSlice};
8use serde::{
9 ser::{
10 SerializeMap, SerializeSeq, SerializeStruct, SerializeStructVariant, SerializeTuple,
11 SerializeTupleStruct, SerializeTupleVariant,
12 },
13 Serialize, Serializer,
14};
15
16use super::error::Error;
17
18#[derive(Debug, Clone, PartialEq, Eq)]
24pub enum Delimiter {
25 String = 134,
27 Byte = 135,
29 Unit = 2,
31 Seq = 3,
33 SeqValue = 4,
35 Map = 139,
37 MapKey = 6,
39 MapValue = 7,
41}
42
43impl std::fmt::Display for Delimiter {
44 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
45 match self {
46 Delimiter::String => write!(f, "String"),
47 Delimiter::Byte => write!(f, "Byte"),
48 Delimiter::Unit => write!(f, "Unit"),
49 Delimiter::Seq => write!(f, "Seq"),
50 Delimiter::SeqValue => write!(f, "SeqValue"),
51 Delimiter::Map => write!(f, "Map"),
52 Delimiter::MapKey => write!(f, "MapKey"),
53 Delimiter::MapValue => write!(f, "MapValue"),
54 }
55 }
56}
57
58#[derive(Debug)]
61struct CustomSerializer {
62 data: bv::BitVec<u8, bv::Lsb0>,
63}
64
65pub fn to_bytes<T: Serialize>(value: &T) -> Result<Vec<u8>, Error> {
69 let mut serializer = CustomSerializer {
70 data: bv::BitVec::new(),
71 };
72 value.serialize(&mut serializer)?;
73 Ok(serializer.data.into_vec())
74}
75
76impl CustomSerializer {
77 fn _peek_n_bits(&self, size: usize) -> Result<&BitSlice<u8>, Error> {
79 let len = self.data.len();
80 if size > len {
81 return Err(Error::NLargerThanLength(size, self.data.len()));
82 }
83 self.data.get(len - size..).ok_or(Error::NoByte)
84 }
85
86 pub fn peek_token(&self, token: Delimiter) -> Result<bool, Error> {
88 let bits = match token {
89 Delimiter::String => self._peek_n_bits(8)?,
90 Delimiter::Byte => self._peek_n_bits(8)?,
91 Delimiter::Map => self._peek_n_bits(8)?,
92 _ => self._peek_n_bits(3)?,
93 };
94 let mut byte = 0u8;
95 for (i, bit) in bits.iter().enumerate() {
96 if *bit {
97 byte |= 1 << i;
98 }
99 }
100 Ok(byte == token as u8)
101 }
102
103 pub fn peek_token_before_n_bits(&self, n: usize) -> Result<u8, Error> {
105 let bits = self._peek_n_bits(n + 3)?[0..3].as_ref();
106 let mut byte = 0u8;
107 for (i, bit) in bits.iter().enumerate() {
108 if *bit {
109 byte |= 1 << i;
110 }
111 }
112 Ok(byte)
113 }
114
115 pub fn serialize_token(&mut self, token: Delimiter) {
117 match token {
118 Delimiter::String => {
119 self.data
120 .extend(&[false, true, true, false, false, false, false, true]);
121 }
123 Delimiter::Byte => {
124 self.data
125 .extend(&[true, true, true, false, false, false, false, true]);
126 }
128 Delimiter::Unit => {
129 self.data.extend(&[false, true, false]); }
131 Delimiter::Seq => {
132 self.data.extend(&[true, true, false]); }
134 Delimiter::SeqValue => {
135 self.data.extend(&[false, false, true]); }
137 Delimiter::Map => {
138 self.data
139 .extend(&[true, true, false, true, false, false, false, true]);
140 }
142 Delimiter::MapKey => {
143 self.data.extend(&[false, true, true]); }
145 Delimiter::MapValue => {
146 self.data.extend(&[true, true, true]); }
148 }
149 }
150}
151
152impl<'a> Serializer for &'a mut CustomSerializer {
153 type Ok = ();
154 type Error = Error;
155
156 type SerializeSeq = Self;
157 type SerializeMap = Self;
158
159 type SerializeTuple = Self;
160 type SerializeStruct = Self;
161
162 type SerializeTupleStruct = Self;
163 type SerializeTupleVariant = Self;
164 type SerializeStructVariant = Self;
165
166 fn serialize_bool(self, v: bool) -> Result<Self::Ok, Self::Error> {
168 self.data.push(v);
169 Ok(())
170 }
171
172 fn serialize_i8(self, v: i8) -> Result<Self::Ok, Self::Error> {
174 self.data.extend(&v.to_le_bytes());
175 Ok(())
176 }
177 fn serialize_i16(self, v: i16) -> Result<Self::Ok, Self::Error> {
178 self.data.extend(&v.to_le_bytes());
179 Ok(())
180 }
181 fn serialize_i32(self, v: i32) -> Result<Self::Ok, Self::Error> {
182 self.data.extend(&v.to_le_bytes());
183 Ok(())
184 }
185 fn serialize_i64(self, v: i64) -> Result<Self::Ok, Self::Error> {
186 self.data.extend(&v.to_le_bytes());
187 Ok(())
188 }
189
190 fn serialize_u8(self, v: u8) -> Result<Self::Ok, Self::Error> {
192 self.data.extend(&v.to_le_bytes());
193 Ok(())
194 }
195 fn serialize_u16(self, v: u16) -> Result<Self::Ok, Self::Error> {
196 self.data.extend(&v.to_le_bytes());
197 Ok(())
198 }
199 fn serialize_u32(self, v: u32) -> Result<Self::Ok, Self::Error> {
200 self.data.extend(&v.to_le_bytes());
201 Ok(())
202 }
203 fn serialize_u64(self, v: u64) -> Result<Self::Ok, Self::Error> {
204 self.data.extend(&v.to_le_bytes());
205 Ok(())
206 }
207
208 fn serialize_f32(self, v: f32) -> Result<Self::Ok, Self::Error> {
210 self.data.extend(&v.to_le_bytes());
211 Ok(())
212 }
213 fn serialize_f64(self, v: f64) -> Result<Self::Ok, Self::Error> {
214 self.data.extend(&v.to_le_bytes());
215 Ok(())
216 }
217
218 fn serialize_char(self, v: char) -> Result<Self::Ok, Self::Error> {
220 self.serialize_u32(u32::from(v))
221 }
222 fn serialize_str(self, v: &str) -> Result<Self::Ok, Self::Error> {
224 self.data.extend(v.as_bytes());
225 self.serialize_token(Delimiter::String);
226 Ok(())
227 }
228 fn serialize_bytes(self, v: &[u8]) -> Result<Self::Ok, Self::Error> {
230 self.data.extend(v);
231 self.serialize_token(Delimiter::Byte);
232 Ok(())
233 }
234
235 fn serialize_unit(self) -> Result<Self::Ok, Self::Error> {
237 self.serialize_token(Delimiter::Unit);
238 Ok(())
239 }
240
241 fn serialize_none(self) -> Result<Self::Ok, Self::Error> {
244 self.serialize_unit()
245 }
246 fn serialize_some<T: ?Sized>(self, value: &T) -> Result<Self::Ok, Self::Error>
248 where
249 T: Serialize,
250 {
251 value.serialize(self)
252 }
253
254 fn serialize_unit_struct(self, _name: &'static str) -> Result<Self::Ok, Self::Error> {
257 self.serialize_unit()
258 }
259 fn serialize_newtype_struct<T: ?Sized>(
261 self,
262 _name: &'static str,
263 value: &T,
264 ) -> Result<Self::Ok, Self::Error>
265 where
266 T: Serialize,
267 {
268 value.serialize(self)
269 }
270 fn serialize_tuple_struct(
272 self,
273 _name: &'static str,
274 len: usize,
275 ) -> Result<Self::SerializeTupleStruct, Self::Error> {
276 self.serialize_tuple(len)
277 }
278
279 fn serialize_unit_variant(
282 self,
283 _name: &'static str,
284 variant_index: u32,
285 _variant: &'static str,
286 ) -> Result<Self::Ok, Self::Error> {
287 self.serialize_u32(variant_index)
288 }
289 fn serialize_newtype_variant<T: ?Sized>(
291 self,
292 _name: &'static str,
293 variant_index: u32,
294 _variant: &'static str,
295 value: &T,
296 ) -> Result<Self::Ok, Self::Error>
297 where
298 T: Serialize,
299 {
300 self.serialize_u32(variant_index)?;
301 value.serialize(self)
302 }
303 fn serialize_tuple_variant(
305 self,
306 _name: &'static str,
307 variant_index: u32,
308 _variant: &'static str,
309 len: usize,
310 ) -> Result<Self::SerializeTupleVariant, Self::Error> {
311 self.serialize_u32(variant_index)?;
312 self.serialize_seq(Some(len))
313 }
314 fn serialize_struct_variant(
316 self,
317 _name: &'static str,
318 variant_index: u32,
319 _variant: &'static str,
320 len: usize,
321 ) -> Result<Self::SerializeStructVariant, Self::Error> {
322 self.serialize_u32(variant_index)?;
323 self.serialize_map(Some(len))
324 }
325
326 fn serialize_seq(self, _len: Option<usize>) -> Result<Self::SerializeSeq, Self::Error> {
328 self.serialize_token(Delimiter::Seq);
329 Ok(self)
330 }
331 fn serialize_map(self, _len: Option<usize>) -> Result<Self::SerializeMap, Self::Error> {
333 Ok(self)
334 }
335
336 fn serialize_tuple(self, len: usize) -> Result<Self::SerializeTuple, Self::Error> {
338 self.serialize_seq(Some(len))
339 }
340 fn serialize_struct(
342 self,
343 _name: &'static str,
344 len: usize,
345 ) -> Result<Self::SerializeStruct, Self::Error> {
346 self.serialize_map(Some(len))
347 }
348}
349
350impl<'a> SerializeSeq for &'a mut CustomSerializer {
351 type Ok = ();
352 type Error = Error;
353
354 fn serialize_element<T: ?Sized>(&mut self, value: &T) -> Result<(), Self::Error>
356 where
357 T: Serialize,
358 {
359 if !self.peek_token(Delimiter::Seq)? {
360 self.serialize_token(Delimiter::SeqValue);
361 }
362 value.serialize(&mut **self)
363 }
364
365 fn end(self) -> Result<Self::Ok, Self::Error> {
366 self.serialize_token(Delimiter::Seq);
367 Ok(())
368 }
369}
370impl<'a> SerializeMap for &'a mut CustomSerializer {
371 type Ok = ();
372 type Error = Error;
373
374 fn serialize_key<T: ?Sized>(&mut self, key: &T) -> Result<(), Self::Error>
376 where
377 T: Serialize,
378 {
379 key.serialize(&mut **self)?;
380 self.serialize_token(Delimiter::MapKey);
381 Ok(())
382 }
383
384 fn serialize_value<T: ?Sized>(&mut self, value: &T) -> Result<(), Self::Error>
386 where
387 T: Serialize,
388 {
389 value.serialize(&mut **self)?;
390 self.serialize_token(Delimiter::MapValue);
391 Ok(())
392 }
393
394 fn end(self) -> Result<Self::Ok, Self::Error> {
396 self.serialize_token(Delimiter::Map);
397 Ok(())
398 }
399}
400
401impl<'a> SerializeTuple for &'a mut CustomSerializer {
403 type Ok = ();
404 type Error = Error;
405
406 fn serialize_element<T: ?Sized>(&mut self, value: &T) -> Result<(), Self::Error>
408 where
409 T: Serialize,
410 {
411 if !self.peek_token(Delimiter::Seq)? {
412 self.serialize_token(Delimiter::SeqValue);
413 }
414 value.serialize(&mut **self)
415 }
416
417 fn end(self) -> Result<Self::Ok, Self::Error> {
419 self.serialize_token(Delimiter::Seq);
420 Ok(())
421 }
422}
423impl<'a> SerializeStruct for &'a mut CustomSerializer {
425 type Ok = ();
426 type Error = Error;
427
428 fn serialize_field<T: ?Sized>(
431 &mut self,
432 key: &'static str,
433 value: &T,
434 ) -> Result<(), Self::Error>
435 where
436 T: Serialize,
437 {
438 key.serialize(&mut **self)?;
439 self.serialize_token(Delimiter::MapKey);
440 value.serialize(&mut **self)?;
441 self.serialize_token(Delimiter::MapValue);
442 Ok(())
443 }
444
445 fn end(self) -> Result<Self::Ok, Self::Error> {
447 self.serialize_token(Delimiter::Map);
448 Ok(())
449 }
450}
451
452impl<'a> SerializeTupleStruct for &'a mut CustomSerializer {
454 type Ok = ();
455 type Error = Error;
456
457 fn serialize_field<T: ?Sized>(&mut self, value: &T) -> Result<(), Self::Error>
460 where
461 T: Serialize,
462 {
463 if !self.peek_token(Delimiter::Seq)? {
464 self.serialize_token(Delimiter::SeqValue);
465 }
466 value.serialize(&mut **self)
467 }
468
469 fn end(self) -> Result<Self::Ok, Self::Error> {
471 self.serialize_token(Delimiter::Seq);
472 Ok(())
473 }
474}
475
476impl<'a> SerializeTupleVariant for &'a mut CustomSerializer {
478 type Ok = ();
479 type Error = Error;
480
481 fn serialize_field<T: ?Sized>(&mut self, value: &T) -> Result<(), Self::Error>
484 where
485 T: Serialize,
486 {
487 if self.peek_token_before_n_bits(32)? != Delimiter::Seq as u8 {
488 self.serialize_token(Delimiter::SeqValue);
489 }
490 value.serialize(&mut **self)
491 }
492
493 fn end(self) -> Result<Self::Ok, Self::Error> {
495 self.serialize_token(Delimiter::Seq);
496 Ok(())
497 }
498}
499
500impl<'a> SerializeStructVariant for &'a mut CustomSerializer {
502 type Ok = ();
503 type Error = Error;
504
505 fn serialize_field<T: ?Sized>(
508 &mut self,
509 key: &'static str,
510 value: &T,
511 ) -> Result<(), Self::Error>
512 where
513 T: Serialize,
514 {
515 key.serialize(&mut **self)?;
516 self.serialize_token(Delimiter::MapKey);
517 value.serialize(&mut **self)?;
518 self.serialize_token(Delimiter::MapValue);
519 Ok(())
520 }
521
522 fn end(self) -> Result<Self::Ok, Self::Error> {
524 self.serialize_token(Delimiter::Map);
525 Ok(())
526 }
527}