1use crate::{Error, Write};
4use serde::Serialize;
5use core::{
6 convert::TryFrom,
7 fmt::{self, Debug, Display},
8};
9
10#[cfg(feature = "alloc")]
11use alloc::vec::Vec;
12
13#[cfg(feature = "alloc")]
15pub fn to_vec<T: Serialize>(x: &T) -> Result<Vec<u8>, Error<core::convert::Infallible>> {
16 let mut serializer = Serializer::new(Vec::new());
17 x.serialize(&mut serializer)?;
18 Ok(serializer.0)
19}
20
21#[derive(Debug)]
23pub struct Serializer<W>(W);
24
25impl<W: Write> Serializer<W> {
26 pub fn new(out: W) -> Self {
28 Self(out)
29 }
30
31 pub fn into_inner(self) -> W {
33 self.0
34 }
35
36 fn serialize_compact(&mut self, v: u64) -> Result<(), Error<W::Error>> {
37 if v < 0x40 {
38 let bytes = [(v << 2 & 0xff) as u8];
39 Ok(self.0.write(&bytes)?)
40 } else if v < 0x4000 {
41 let bytes = [
42 ((v << 2 | 0x1) & 0xff) as u8,
43 (v >> 6 & 0xff) as u8,
44 ];
45 Ok(self.0.write(&bytes)?)
46 } else if v < 0x4000_0000 {
47 let high = v >> 6;
48 let bytes = [
49 ((v << 2 | 0x2) & 0xff) as u8,
50 (high & 0xff) as u8,
51 (high >> 8 & 0xff) as u8,
52 (high >> 16 & 0xff) as u8,
53 ];
54 Ok(self.0.write(&bytes)?)
55 } else {
56 let mut bytes = [0u8; 9];
57 let mut v = v;
58 let src = core::iter::from_fn(|| {
59 if v == 0 { return None; }
60 let low = (v & 0xff) as u8;
61 v >>= 8;
62 Some(low)
63 });
64 let end = bytes.iter_mut()
65 .skip(1)
66 .zip(src)
67 .enumerate()
68 .map(|(i, (dst, src))| {
69 *dst = src;
70 i
71 })
72 .last()
73 .unwrap() + 1;
74 bytes[0] = (end - 4 << 2 & 0x3) as u8;
75 Ok(self.0.write(&bytes[..end + 1])?)
76 }
77 }
78}
79
80impl<'a, W: Write> serde::Serializer for &'a mut Serializer<W> {
81 type Ok = ();
82 type Error = Error<W::Error>;
83 type SerializeSeq = Compound<'a, W>;
84 type SerializeTuple = Compound<'a, W>;
85 type SerializeTupleStruct = Compound<'a, W>;
86 type SerializeTupleVariant = Compound<'a, W>;
87 type SerializeMap = Compound<'a, W>;
88 type SerializeStruct = Compound<'a, W>;
89 type SerializeStructVariant = Compound<'a, W>;
90
91 fn serialize_bool(self, v: bool) -> Result<Self::Ok, Self::Error> {
92 self.serialize_u8(v as u8)
93 }
94
95 fn serialize_i8(self, v: i8) -> Result<Self::Ok, Self::Error> {
96 Ok(self.0.write(&v.to_le_bytes())?)
97 }
98
99 fn serialize_i16(self, v: i16) -> Result<Self::Ok, Self::Error> {
100 Ok(self.0.write(&v.to_le_bytes())?)
101 }
102
103 fn serialize_i32(self, v: i32) -> Result<Self::Ok, Self::Error> {
104 Ok(self.0.write(&v.to_le_bytes())?)
105 }
106
107 fn serialize_i64(self, v: i64) -> Result<Self::Ok, Self::Error> {
108 Ok(self.0.write(&v.to_le_bytes())?)
109 }
110
111 fn serialize_u8(self, v: u8) -> Result<Self::Ok, Self::Error> {
112 Ok(self.0.write(&v.to_le_bytes())?)
113 }
114
115 fn serialize_u16(self, v: u16) -> Result<Self::Ok, Self::Error> {
116 Ok(self.0.write(&v.to_le_bytes())?)
117 }
118
119 fn serialize_u32(self, v: u32) -> Result<Self::Ok, Self::Error> {
120 Ok(self.0.write(&v.to_le_bytes())?)
121 }
122
123 fn serialize_u64(self, v: u64) -> Result<Self::Ok, Self::Error> {
124 Ok(self.0.write(&v.to_le_bytes())?)
125 }
126
127 fn serialize_f32(self, _: f32) -> Result<Self::Ok, Self::Error> {
128 Err(Error::FloatingPointUnsupported)
129 }
130
131 fn serialize_f64(self, _: f64) -> Result<Self::Ok, Self::Error> {
132 Err(Error::FloatingPointUnsupported)
133 }
134
135 fn serialize_char(self, v: char) -> Result<Self::Ok, Self::Error> {
136 self.serialize_u32(v as u32)
137 }
138
139 fn serialize_str(self, v: &str) -> Result<Self::Ok, Self::Error> {
140 self.serialize_bytes(v.as_bytes())
141 }
142
143 fn serialize_bytes(self, v: &[u8]) -> Result<Self::Ok, Self::Error> {
144 let len = v.len();
145 let len = u64::try_from(len).map_err(|_| Error::CollectionTooLargeToSerialize { len })?;
146 self.serialize_compact(len)?;
147 Ok(self.0.write(v)?)
148 }
149
150 fn serialize_none(self) -> Result<Self::Ok, Self::Error> {
151 self.serialize_u8(0)
152 }
153
154 fn serialize_some<T>(self, v: &T) -> Result<Self::Ok, Self::Error>
155 where
156 T: Serialize + ?Sized,
157 {
158 if let Ok(x) = v.serialize(OptionalBoolSerializer) {
159 return self.serialize_u8(x);
160 }
161 self.serialize_u8(1)?;
162 v.serialize(self)
163 }
164
165 fn serialize_unit(self) -> Result<Self::Ok, Self::Error> {
166 Ok(())
167 }
168
169 fn serialize_unit_struct(self, _: &'static str) -> Result<Self::Ok, Self::Error> {
170 self.serialize_unit()
171 }
172
173 fn serialize_unit_variant(
174 self,
175 name: &'static str,
176 variant_index: u32,
177 variant: &'static str,
178 ) -> Result<Self::Ok, Self::Error> {
179 let discriminant = u8::try_from(variant_index).map_err(|_| {
180 Error::TooManyVariants {
181 enum_name: name,
182 variant_name: variant,
183 variant_index,
184 }
185 })?;
186 self.serialize_u8(discriminant)
187 }
188
189 fn serialize_newtype_struct<T>(
190 self,
191 _: &'static str,
192 value: &T,
193 ) -> Result<Self::Ok, Self::Error>
194 where
195 T: Serialize + ?Sized,
196 {
197 value.serialize(self)
198 }
199
200 fn serialize_newtype_variant<T>(
201 self,
202 name: &'static str,
203 variant_index: u32,
204 variant: &'static str,
205 value: &T,
206 ) -> Result<Self::Ok, Self::Error>
207 where
208 T: Serialize + ?Sized,
209 {
210 self.serialize_unit_variant(name, variant_index, variant)?;
211 value.serialize(self)
212 }
213
214 fn serialize_seq(self, len: Option<usize>) -> Result<Self::SerializeSeq, Self::Error> {
215 let len = len.ok_or(Error::LengthNeeded)?;
216 let len = u64::try_from(len).map_err(|_| Error::CollectionTooLargeToSerialize { len })?;
217 self.serialize_compact(len)?;
218 Ok(Compound(self))
219 }
220
221 fn serialize_tuple(self, _: usize) -> Result<Self::SerializeTuple, Self::Error> {
222 Ok(Compound(self))
223 }
224
225 fn serialize_tuple_struct(
226 self,
227 _: &'static str,
228 _: usize,
229 ) -> Result<Self::SerializeTupleStruct, Self::Error> {
230 Ok(Compound(self))
231 }
232
233 fn serialize_tuple_variant(
234 self,
235 name: &'static str,
236 variant_index: u32,
237 variant: &'static str,
238 _: usize,
239 ) -> Result<Self::SerializeTupleVariant, Self::Error> {
240 self.serialize_unit_variant(name, variant_index, variant)?;
241 Ok(Compound(self))
242 }
243
244 fn serialize_map(self, len: Option<usize>) -> Result<Self::SerializeMap, Self::Error> {
245 let len = len.ok_or(Error::LengthNeeded)?;
246 let len = u64::try_from(len).map_err(|_| Error::CollectionTooLargeToSerialize { len })?;
247 self.serialize_compact(len)?;
248 Ok(Compound(self))
249 }
250
251 fn serialize_struct(
252 self,
253 _: &'static str,
254 _: usize,
255 ) -> Result<Self::SerializeStruct, Self::Error> {
256 Ok(Compound(self))
257 }
258
259 fn serialize_struct_variant(
260 self,
261 name: &'static str,
262 variant_index: u32,
263 variant: &'static str,
264 _: usize,
265 ) -> Result<Self::SerializeStructVariant, Self::Error> {
266 self.serialize_unit_variant(name, variant_index, variant)?;
267 Ok(Compound(self))
268 }
269
270 #[cfg(not(feature = "alloc"))]
271 fn collect_str<T: ?Sized>(self, _: &T) -> Result<Self::Ok, Self::Error>
272 where
273 T: core::fmt::Display,
274 {
275 Err(serde::ser::Error::custom("Unsupported `collect_str` without `alloc` feature"))
276 }
277}
278
279mod compound {
280 pub struct Compound<'a, W>(pub &'a mut super::Serializer<W>);
281}
282
283use compound::Compound;
284
285impl<W: Write> serde::ser::SerializeSeq for Compound<'_, W> {
286 type Ok = ();
287 type Error = Error<W::Error>;
288
289 fn serialize_element<T>(&mut self, value: &T) -> Result<(), Self::Error>
290 where
291 T: Serialize + ?Sized,
292 {
293 value.serialize(&mut *self.0)
294 }
295
296 fn end(self) -> Result<Self::Ok, Self::Error> {
297 Ok(())
298 }
299}
300
301impl<W: Write> serde::ser::SerializeTuple for Compound<'_, W> {
302 type Ok = ();
303 type Error = Error<W::Error>;
304
305 fn serialize_element<T>(&mut self, value: &T) -> Result<(), Self::Error>
306 where
307 T: Serialize + ?Sized,
308 {
309 value.serialize(&mut *self.0)
310 }
311
312 fn end(self) -> Result<Self::Ok, Self::Error> {
313 Ok(())
314 }
315}
316
317impl<W: Write> serde::ser::SerializeTupleStruct for Compound<'_, W> {
318 type Ok = ();
319 type Error = Error<W::Error>;
320
321 fn serialize_field<T>(&mut self, value: &T) -> Result<(), Self::Error>
322 where
323 T: Serialize + ?Sized,
324 {
325 value.serialize(&mut *self.0)
326 }
327
328 fn end(self) -> Result<Self::Ok, Self::Error> {
329 Ok(())
330 }
331}
332
333impl<W: Write> serde::ser::SerializeTupleVariant for Compound<'_, W> {
334 type Ok = ();
335 type Error = Error<W::Error>;
336
337 fn serialize_field<T>(&mut self, value: &T) -> Result<(), Self::Error>
338 where
339 T: Serialize + ?Sized,
340 {
341 value.serialize(&mut *self.0)
342 }
343
344 fn end(self) -> Result<Self::Ok, Self::Error> {
345 Ok(())
346 }
347}
348
349impl<W: Write> serde::ser::SerializeMap for Compound<'_, W> {
350 type Ok = ();
351 type Error = Error<W::Error>;
352
353 fn serialize_key<T>(&mut self, key: &T) -> Result<(), Self::Error>
354 where
355 T: Serialize + ?Sized,
356 {
357 self.0.serialize_compact(2)?;
358 key.serialize(&mut *self.0)
359 }
360
361 fn serialize_value<T>(&mut self, value: &T) -> Result<(), Self::Error>
362 where
363 T: Serialize + ?Sized,
364 {
365 value.serialize(&mut *self.0)
366 }
367
368 fn end(self) -> Result<Self::Ok, Self::Error> {
369 Ok(())
370 }
371}
372
373impl<W: Write> serde::ser::SerializeStruct for Compound<'_, W> {
374 type Ok = ();
375 type Error = Error<W::Error>;
376
377 fn serialize_field<T>(&mut self, _: &'static str, value: &T) -> Result<(), Self::Error>
378 where
379 T: Serialize + ?Sized,
380 {
381 value.serialize(&mut *self.0)
382 }
383
384 fn end(self) -> Result<Self::Ok, Self::Error> {
385 Ok(())
386 }
387}
388
389impl<W: Write> serde::ser::SerializeStructVariant for Compound<'_, W> {
390 type Ok = ();
391 type Error = Error<W::Error>;
392
393 fn serialize_field<T>(&mut self, _: &'static str, value: &T) -> Result<(), Self::Error>
394 where
395 T: Serialize + ?Sized,
396 {
397 value.serialize(&mut *self.0)
398 }
399
400 fn end(self) -> Result<Self::Ok, Self::Error> {
401 Ok(())
402 }
403}
404
405struct OptionalBoolSerializer;
406type Impossible = serde::ser::Impossible<u8, VoidError>;
407
408#[derive(Debug)]
409struct VoidError;
410
411impl Display for VoidError {
412 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
413 f.write_str("VoidError")
414 }
415}
416
417impl serde::ser::StdError for VoidError {}
418
419impl serde::ser::Error for VoidError {
420 fn custom<T: Display>(_: T) -> Self {
421 VoidError
422 }
423}
424
425impl serde::Serializer for OptionalBoolSerializer {
426 type Ok = u8;
427 type Error = VoidError;
428 type SerializeSeq = Impossible;
429 type SerializeTuple = Impossible;
430 type SerializeTupleStruct = Impossible;
431 type SerializeTupleVariant = Impossible;
432 type SerializeMap = Impossible;
433 type SerializeStruct = Impossible;
434 type SerializeStructVariant = Impossible;
435
436 fn serialize_bool(self, v: bool) -> Result<Self::Ok, Self::Error> {
437 Ok(if v { 1 } else { 2 })
438 }
439
440 fn serialize_i8(self, _: i8) -> Result<Self::Ok, Self::Error> {
441 Err(VoidError)
442 }
443
444 fn serialize_i16(self, _: i16) -> Result<Self::Ok, Self::Error> {
445 Err(VoidError)
446 }
447
448 fn serialize_i32(self, _: i32) -> Result<Self::Ok, Self::Error> {
449 Err(VoidError)
450 }
451
452 fn serialize_i64(self, _: i64) -> Result<Self::Ok, Self::Error> {
453 Err(VoidError)
454 }
455
456 fn serialize_u8(self, _: u8) -> Result<Self::Ok, Self::Error> {
457 Err(VoidError)
458 }
459
460 fn serialize_u16(self, _: u16) -> Result<Self::Ok, Self::Error> {
461 Err(VoidError)
462 }
463
464 fn serialize_u32(self, _: u32) -> Result<Self::Ok, Self::Error> {
465 Err(VoidError)
466 }
467
468 fn serialize_u64(self, _: u64) -> Result<Self::Ok, Self::Error> {
469 Err(VoidError)
470 }
471
472 fn serialize_f32(self, _: f32) -> Result<Self::Ok, Self::Error> {
473 Err(VoidError)
474 }
475
476 fn serialize_f64(self, _: f64) -> Result<Self::Ok, Self::Error> {
477 Err(VoidError)
478 }
479
480 fn serialize_char(self, _: char) -> Result<Self::Ok, Self::Error> {
481 Err(VoidError)
482 }
483
484 fn serialize_str(self, _: &str) -> Result<Self::Ok, Self::Error> {
485 Err(VoidError)
486 }
487
488 fn serialize_bytes(self, _: &[u8]) -> Result<Self::Ok, Self::Error> {
489 Err(VoidError)
490 }
491
492 fn serialize_none(self) -> Result<Self::Ok, Self::Error> {
493 Err(VoidError)
494 }
495
496 fn serialize_some<T>(self, _: &T) -> Result<Self::Ok, Self::Error>
497 where
498 T: Serialize + ?Sized,
499 {
500 Err(VoidError)
501 }
502
503 fn serialize_unit(self) -> Result<Self::Ok, Self::Error> {
504 Err(VoidError)
505 }
506
507 fn serialize_unit_struct(self, _: &'static str) -> Result<Self::Ok, Self::Error> {
508 Err(VoidError)
509 }
510
511 fn serialize_unit_variant(
512 self,
513 _: &'static str,
514 _: u32,
515 _: &'static str,
516 ) -> Result<Self::Ok, Self::Error> {
517 Err(VoidError)
518 }
519
520 fn serialize_newtype_struct<T>(
521 self,
522 _: &'static str,
523 _: &T,
524 ) -> Result<Self::Ok, Self::Error>
525 where
526 T: Serialize + ?Sized,
527 {
528 Err(VoidError)
529 }
530
531 fn serialize_newtype_variant<T>(
532 self,
533 _: &'static str,
534 _: u32,
535 _: &'static str,
536 _: &T,
537 ) -> Result<Self::Ok, Self::Error>
538 where
539 T: Serialize + ?Sized,
540 {
541 Err(VoidError)
542 }
543
544 fn serialize_seq(self, _: Option<usize>) -> Result<Self::SerializeSeq, Self::Error> {
545 Err(VoidError)
546 }
547
548 fn serialize_tuple(self, _: usize) -> Result<Self::SerializeTuple, Self::Error> {
549 Err(VoidError)
550 }
551
552 fn serialize_tuple_struct(
553 self,
554 _: &'static str,
555 _: usize,
556 ) -> Result<Self::SerializeTupleStruct, Self::Error> {
557 Err(VoidError)
558 }
559
560 fn serialize_tuple_variant(
561 self,
562 _: &'static str,
563 _: u32,
564 _: &'static str,
565 _: usize,
566 ) -> Result<Self::SerializeTupleVariant, Self::Error> {
567 Err(VoidError)
568 }
569
570 fn serialize_map(self, _: Option<usize>) -> Result<Self::SerializeMap, Self::Error> {
571 Err(VoidError)
572 }
573
574 fn serialize_struct(
575 self,
576 _: &'static str,
577 _: usize,
578 ) -> Result<Self::SerializeStruct, Self::Error> {
579 Err(VoidError)
580 }
581
582 fn serialize_struct_variant(
583 self,
584 _: &'static str,
585 _: u32,
586 _: &'static str,
587 _: usize,
588 ) -> Result<Self::SerializeStructVariant, Self::Error> {
589 Err(VoidError)
590 }
591
592 #[cfg(not(feature = "alloc"))]
593 fn collect_str<T: ?Sized>(self, _: &T) -> Result<Self::Ok, Self::Error>
594 where
595 T: core::fmt::Display,
596 {
597 Err(VoidError)
598 }
599}
600
601#[cfg(all(test, feature = "alloc"))]
602mod tests {
603 use crate::to_vec;
604
605 #[test]
606 fn none_bool_serializes_as_0() {
607 assert_eq!(to_vec(&None::<bool>).unwrap(), [0]);
608 }
609
610 #[test]
611 fn some_true_serializes_as_1() {
612 assert_eq!(to_vec(&Some(true)).unwrap(), [1]);
613 }
614
615 #[test]
616 fn some_false_serializes_as_2() {
617 assert_eq!(to_vec(&Some(false)).unwrap(), [2]);
618 }
619}