1pub use cbor4ii::core::utils::BufWriter;
4use {
5 super::{error::EncodeError, CBOR_TAGS_CID},
6 crate::cid::serde::CID_SERDE_PRIVATE_IDENTIFIER,
7 alloc::{collections::TryReserveError, string::ToString, vec::Vec},
8 cbor4ii::core::{
9 enc::{self, Encode},
10 types,
11 },
12 serde::{ser, Serialize},
13};
14
15pub fn to_vec<T>(value: &T) -> Result<Vec<u8>, EncodeError<TryReserveError>>
17where
18 T: Serialize + ?Sized,
19{
20 let writer = BufWriter::new(Vec::new());
21 let mut serializer = Serializer::new(writer);
22 value.serialize(&mut serializer)?;
23 Ok(serializer.into_inner().into_inner())
24}
25
26pub struct Serializer<W> {
28 writer: W,
29}
30
31impl<W> Serializer<W> {
32 pub fn new(writer: W) -> Serializer<W> {
34 Serializer { writer }
35 }
36
37 pub fn into_inner(self) -> W {
39 self.writer
40 }
41}
42
43impl<'a, W: enc::Write> serde::Serializer for &'a mut Serializer<W> {
44 type Error = EncodeError<W::Error>;
45 type Ok = ();
46 type SerializeMap = CollectMap<'a, W>;
47 type SerializeSeq = CollectSeq<'a, W>;
48 type SerializeStruct = CollectMap<'a, W>;
49 type SerializeStructVariant = CollectMap<'a, W>;
50 type SerializeTuple = BoundedCollect<'a, W>;
51 type SerializeTupleStruct = BoundedCollect<'a, W>;
52 type SerializeTupleVariant = BoundedCollect<'a, W>;
53
54 #[inline]
55 fn serialize_bool(self, v: bool) -> Result<Self::Ok, Self::Error> {
56 v.encode(&mut self.writer)?;
57 Ok(())
58 }
59
60 #[inline]
61 fn serialize_i8(self, v: i8) -> Result<Self::Ok, Self::Error> {
62 v.encode(&mut self.writer)?;
63 Ok(())
64 }
65
66 #[inline]
67 fn serialize_i16(self, v: i16) -> Result<Self::Ok, Self::Error> {
68 v.encode(&mut self.writer)?;
69 Ok(())
70 }
71
72 #[inline]
73 fn serialize_i32(self, v: i32) -> Result<Self::Ok, Self::Error> {
74 v.encode(&mut self.writer)?;
75 Ok(())
76 }
77
78 #[inline]
79 fn serialize_i64(self, v: i64) -> Result<Self::Ok, Self::Error> {
80 v.encode(&mut self.writer)?;
81 Ok(())
82 }
83
84 #[inline]
85 fn serialize_u8(self, v: u8) -> Result<Self::Ok, Self::Error> {
86 v.encode(&mut self.writer)?;
87 Ok(())
88 }
89
90 #[inline]
91 fn serialize_u16(self, v: u16) -> Result<Self::Ok, Self::Error> {
92 v.encode(&mut self.writer)?;
93 Ok(())
94 }
95
96 #[inline]
97 fn serialize_u32(self, v: u32) -> Result<Self::Ok, Self::Error> {
98 v.encode(&mut self.writer)?;
99 Ok(())
100 }
101
102 #[inline]
103 fn serialize_u64(self, v: u64) -> Result<Self::Ok, Self::Error> {
104 v.encode(&mut self.writer)?;
105 Ok(())
106 }
107
108 #[inline]
109 fn serialize_f32(self, v: f32) -> Result<Self::Ok, Self::Error> {
110 self.serialize_f64(f64::from(v))
112 }
113
114 #[inline]
115 fn serialize_f64(self, v: f64) -> Result<Self::Ok, Self::Error> {
116 if !v.is_finite() {
118 Err(EncodeError::Msg(
119 "Float must be a finite number, not Infinity or NaN".into(),
120 ))
121 } else {
122 v.encode(&mut self.writer)?;
123 Ok(())
124 }
125 }
126
127 #[inline]
128 fn serialize_char(self, v: char) -> Result<Self::Ok, Self::Error> {
129 let mut buf = [0; 4];
130 self.serialize_str(v.encode_utf8(&mut buf))
131 }
132
133 #[inline]
134 fn serialize_str(self, v: &str) -> Result<Self::Ok, Self::Error> {
135 v.encode(&mut self.writer)?;
136 Ok(())
137 }
138
139 #[inline]
140 fn serialize_bytes(self, v: &[u8]) -> Result<Self::Ok, Self::Error> {
141 types::Bytes(v).encode(&mut self.writer)?;
142 Ok(())
143 }
144
145 #[inline]
146 fn serialize_none(self) -> Result<Self::Ok, Self::Error> {
147 types::Null.encode(&mut self.writer)?;
148 Ok(())
149 }
150
151 #[inline]
152 fn serialize_some<T: Serialize + ?Sized>(
153 self,
154 value: &T,
155 ) -> Result<Self::Ok, Self::Error> {
156 value.serialize(self)
157 }
158
159 #[inline]
160 fn serialize_unit(self) -> Result<Self::Ok, Self::Error> {
161 types::Null.encode(&mut self.writer)?;
164 Ok(())
165 }
166
167 #[inline]
168 fn serialize_unit_struct(
169 self,
170 _name: &'static str,
171 ) -> Result<Self::Ok, Self::Error> {
172 self.serialize_unit()
173 }
174
175 #[inline]
176 fn serialize_unit_variant(
177 self,
178 _name: &'static str,
179 _variant_index: u32,
180 variant: &'static str,
181 ) -> Result<Self::Ok, Self::Error> {
182 self.serialize_str(variant)
183 }
184
185 #[inline]
186 fn serialize_newtype_struct<T: Serialize + ?Sized>(
187 self,
188 name: &'static str,
189 value: &T,
190 ) -> Result<Self::Ok, Self::Error> {
191 if name == CID_SERDE_PRIVATE_IDENTIFIER {
192 value.serialize(&mut CidSerializer(self))
193 } else {
194 value.serialize(self)
195 }
196 }
197
198 #[inline]
199 fn serialize_newtype_variant<T: Serialize + ?Sized>(
200 self,
201 _name: &'static str,
202 _variant_index: u32,
203 variant: &'static str,
204 value: &T,
205 ) -> Result<Self::Ok, Self::Error> {
206 enc::MapStartBounded(1).encode(&mut self.writer)?;
207 variant.encode(&mut self.writer)?;
208 value.serialize(self)
209 }
210
211 #[inline]
212 fn serialize_seq(
213 self,
214 len: Option<usize>,
215 ) -> Result<Self::SerializeSeq, Self::Error> {
216 CollectSeq::new(self, len)
217 }
218
219 #[inline]
220 fn serialize_tuple(
221 self,
222 len: usize,
223 ) -> Result<Self::SerializeTuple, Self::Error> {
224 enc::ArrayStartBounded(len).encode(&mut self.writer)?;
225 Ok(BoundedCollect { ser: self })
226 }
227
228 #[inline]
229 fn serialize_tuple_struct(
230 self,
231 _name: &'static str,
232 len: usize,
233 ) -> Result<Self::SerializeTupleStruct, Self::Error> {
234 self.serialize_tuple(len)
235 }
236
237 #[inline]
238 fn serialize_tuple_variant(
239 self,
240 _name: &'static str,
241 _variant_index: u32,
242 variant: &'static str,
243 len: usize,
244 ) -> Result<Self::SerializeTupleVariant, Self::Error> {
245 enc::MapStartBounded(1).encode(&mut self.writer)?;
246 variant.encode(&mut self.writer)?;
247 enc::ArrayStartBounded(len).encode(&mut self.writer)?;
248 Ok(BoundedCollect { ser: self })
249 }
250
251 #[inline]
252 fn serialize_map(
253 self,
254 _len: Option<usize>,
255 ) -> Result<Self::SerializeMap, Self::Error> {
256 Ok(CollectMap::new(self))
257 }
258
259 #[inline]
260 fn serialize_struct(
261 self,
262 _name: &'static str,
263 len: usize,
264 ) -> Result<Self::SerializeStruct, Self::Error> {
265 enc::MapStartBounded(len).encode(&mut self.writer)?;
266 Ok(CollectMap::new(self))
267 }
268
269 #[inline]
270 fn serialize_struct_variant(
271 self,
272 _name: &'static str,
273 _variant_index: u32,
274 variant: &'static str,
275 len: usize,
276 ) -> Result<Self::SerializeStructVariant, Self::Error> {
277 enc::MapStartBounded(1).encode(&mut self.writer)?;
278 variant.encode(&mut self.writer)?;
279 enc::MapStartBounded(len).encode(&mut self.writer)?;
280 Ok(CollectMap::new(self))
281 }
282
283 #[inline]
284 fn serialize_i128(self, v: i128) -> Result<Self::Ok, Self::Error> {
285 if !(u64::MAX as i128 >= v && -(u64::MAX as i128 + 1) <= v) {
286 return Err(EncodeError::Msg(
287 "Integer must be within [-u64::MAX-1, u64::MAX] range".into(),
288 ));
289 }
290
291 v.encode(&mut self.writer)?;
292 Ok(())
293 }
294
295 #[inline]
296 fn serialize_u128(self, v: u128) -> Result<Self::Ok, Self::Error> {
297 if (u64::MAX as u128) < v {
298 return Err(EncodeError::Msg(
299 "Unsigned integer must be within [0, u64::MAX] range".into(),
300 ));
301 }
302 v.encode(&mut self.writer)?;
303 Ok(())
304 }
305
306 #[inline]
307 fn is_human_readable(&self) -> bool {
308 false
309 }
310}
311
312pub struct CollectSeq<'a, W> {
314 count: usize,
317 ser: &'a mut Serializer<W>,
318 mem_ser: Option<Serializer<BufWriter>>,
321}
322
323impl<'a, W: enc::Write> CollectSeq<'a, W> {
324 fn new(
328 ser: &'a mut Serializer<W>,
329 len: Option<usize>,
330 ) -> Result<Self, EncodeError<W::Error>> {
331 let mem_ser = if let Some(len) = len {
332 enc::ArrayStartBounded(len).encode(&mut ser.writer)?;
333 None
334 } else {
335 Some(Serializer::new(BufWriter::new(Vec::new())))
336 };
337 Ok(Self {
338 count: 0,
339 ser,
340 mem_ser,
341 })
342 }
343}
344
345pub struct BoundedCollect<'a, W> {
347 ser: &'a mut Serializer<W>,
348}
349
350impl<W: enc::Write> serde::ser::SerializeSeq for CollectSeq<'_, W> {
351 type Error = EncodeError<W::Error>;
352 type Ok = ();
353
354 #[inline]
355 fn serialize_element<T: Serialize + ?Sized>(
356 &mut self,
357 value: &T,
358 ) -> Result<(), Self::Error> {
359 self.count += 1;
360 if let Some(ser) = self.mem_ser.as_mut() {
361 value.serialize(&mut *ser).map_err(|_| {
362 EncodeError::Msg("List element cannot be serialized".to_string())
363 })
364 } else {
365 value.serialize(&mut *self.ser)
366 }
367 }
368
369 #[inline]
370 fn end(self) -> Result<Self::Ok, Self::Error> {
371 if let Some(ser) = self.mem_ser {
374 enc::ArrayStartBounded(self.count).encode(&mut self.ser.writer)?;
375 self.ser.writer.push(&ser.into_inner().into_inner())?;
376 }
377
378 Ok(())
379 }
380}
381
382impl<W: enc::Write> serde::ser::SerializeTuple for BoundedCollect<'_, W> {
383 type Error = EncodeError<W::Error>;
384 type Ok = ();
385
386 #[inline]
387 fn serialize_element<T: Serialize + ?Sized>(
388 &mut self,
389 value: &T,
390 ) -> Result<(), Self::Error> {
391 value.serialize(&mut *self.ser)
392 }
393
394 #[inline]
395 fn end(self) -> Result<Self::Ok, Self::Error> {
396 Ok(())
397 }
398}
399
400impl<W: enc::Write> serde::ser::SerializeTupleStruct for BoundedCollect<'_, W> {
401 type Error = EncodeError<W::Error>;
402 type Ok = ();
403
404 #[inline]
405 fn serialize_field<T: Serialize + ?Sized>(
406 &mut self,
407 value: &T,
408 ) -> Result<(), Self::Error> {
409 value.serialize(&mut *self.ser)
410 }
411
412 #[inline]
413 fn end(self) -> Result<Self::Ok, Self::Error> {
414 Ok(())
415 }
416}
417
418impl<W: enc::Write> serde::ser::SerializeTupleVariant
419 for BoundedCollect<'_, W>
420{
421 type Error = EncodeError<W::Error>;
422 type Ok = ();
423
424 #[inline]
425 fn serialize_field<T: Serialize + ?Sized>(
426 &mut self,
427 value: &T,
428 ) -> Result<(), Self::Error> {
429 value.serialize(&mut *self.ser)
430 }
431
432 #[inline]
433 fn end(self) -> Result<Self::Ok, Self::Error> {
434 Ok(())
435 }
436}
437
438pub struct CollectMap<'a, W> {
444 buffer: BufWriter,
445 entries: Vec<Vec<u8>>,
446 ser: &'a mut Serializer<W>,
447}
448
449impl<'a, W> CollectMap<'a, W>
450where
451 W: enc::Write,
452{
453 fn new(ser: &'a mut Serializer<W>) -> Self {
454 Self {
455 buffer: BufWriter::new(Vec::new()),
456 entries: Vec::new(),
457 ser,
458 }
459 }
460
461 fn serialize<T: Serialize + ?Sized>(
462 &mut self,
463 maybe_key: Option<&'static str>,
464 value: &T,
465 ) -> Result<(), EncodeError<W::Error>> {
466 let mut mem_serializer = Serializer::new(&mut self.buffer);
468 if let Some(key) = maybe_key {
469 key.serialize(&mut mem_serializer).map_err(|_| {
470 EncodeError::Msg("Struct key cannot be serialized.".to_string())
471 })?;
472 }
473 value.serialize(&mut mem_serializer).map_err(|_| {
474 EncodeError::Msg("Struct value cannot be serialized.".to_string())
475 })?;
476
477 self.entries.push(self.buffer.buffer().to_vec());
478 self.buffer.clear();
479
480 Ok(())
481 }
482
483 fn end(mut self) -> Result<(), EncodeError<W::Error>> {
484 self.entries.sort_unstable();
492 for entry in self.entries {
493 self.ser.writer.push(&entry)?;
494 }
495 Ok(())
496 }
497}
498
499impl<W> serde::ser::SerializeMap for CollectMap<'_, W>
500where
501 W: enc::Write,
502{
503 type Error = EncodeError<W::Error>;
504 type Ok = ();
505
506 #[inline]
507 fn serialize_key<T: Serialize + ?Sized>(
508 &mut self,
509 key: &T,
510 ) -> Result<(), Self::Error> {
511 let mut mem_serializer = Serializer::new(&mut self.buffer);
514 key.serialize(&mut mem_serializer).map_err(|_| {
515 EncodeError::Msg("Map key cannot be serialized.".to_string())
516 })?;
517 Ok(())
518 }
519
520 #[inline]
521 fn serialize_value<T: Serialize + ?Sized>(
522 &mut self,
523 value: &T,
524 ) -> Result<(), Self::Error> {
525 self.serialize(None, value)
526 }
527
528 #[inline]
529 fn end(self) -> Result<Self::Ok, Self::Error> {
530 enc::MapStartBounded(self.entries.len()).encode(&mut self.ser.writer)?;
531 self.end()
532 }
533}
534
535impl<W> serde::ser::SerializeStruct for CollectMap<'_, W>
536where
537 W: enc::Write,
538{
539 type Error = EncodeError<W::Error>;
540 type Ok = ();
541
542 #[inline]
543 fn serialize_field<T: Serialize + ?Sized>(
544 &mut self,
545 key: &'static str,
546 value: &T,
547 ) -> Result<(), Self::Error> {
548 self.serialize(Some(key), value)
549 }
550
551 #[inline]
552 fn end(self) -> Result<Self::Ok, Self::Error> {
553 self.end()
554 }
555}
556
557impl<W> serde::ser::SerializeStructVariant for CollectMap<'_, W>
558where
559 W: enc::Write,
560{
561 type Error = EncodeError<W::Error>;
562 type Ok = ();
563
564 #[inline]
565 fn serialize_field<T: Serialize + ?Sized>(
566 &mut self,
567 key: &'static str,
568 value: &T,
569 ) -> Result<(), Self::Error> {
570 self.serialize(Some(key), value)
571 }
572
573 #[inline]
574 fn end(self) -> Result<Self::Ok, Self::Error> {
575 self.end()
576 }
577}
578
579struct CidSerializer<'a, W>(&'a mut Serializer<W>);
581
582impl<'a, W: enc::Write> ser::Serializer for &'a mut CidSerializer<'a, W>
583where
584 W::Error: core::fmt::Debug,
585{
586 type Error = EncodeError<W::Error>;
587 type Ok = ();
588 type SerializeMap = ser::Impossible<Self::Ok, Self::Error>;
589 type SerializeSeq = ser::Impossible<Self::Ok, Self::Error>;
590 type SerializeStruct = ser::Impossible<Self::Ok, Self::Error>;
591 type SerializeStructVariant = ser::Impossible<Self::Ok, Self::Error>;
592 type SerializeTuple = ser::Impossible<Self::Ok, Self::Error>;
593 type SerializeTupleStruct = ser::Impossible<Self::Ok, Self::Error>;
594 type SerializeTupleVariant = ser::Impossible<Self::Ok, Self::Error>;
595
596 fn serialize_bool(self, _value: bool) -> Result<Self::Ok, Self::Error> {
597 Err(ser::Error::custom("unreachable"))
598 }
599
600 fn serialize_i8(self, _value: i8) -> Result<Self::Ok, Self::Error> {
601 Err(ser::Error::custom("unreachable"))
602 }
603
604 fn serialize_i16(self, _value: i16) -> Result<Self::Ok, Self::Error> {
605 Err(ser::Error::custom("unreachable"))
606 }
607
608 fn serialize_i32(self, _value: i32) -> Result<Self::Ok, Self::Error> {
609 Err(ser::Error::custom("unreachable"))
610 }
611
612 fn serialize_i64(self, _value: i64) -> Result<Self::Ok, Self::Error> {
613 Err(ser::Error::custom("unreachable"))
614 }
615
616 fn serialize_u8(self, _value: u8) -> Result<Self::Ok, Self::Error> {
617 Err(ser::Error::custom("unreachable"))
618 }
619
620 fn serialize_u16(self, _value: u16) -> Result<Self::Ok, Self::Error> {
621 Err(ser::Error::custom("unreachable"))
622 }
623
624 fn serialize_u32(self, _value: u32) -> Result<Self::Ok, Self::Error> {
625 Err(ser::Error::custom("unreachable"))
626 }
627
628 fn serialize_u64(self, _value: u64) -> Result<Self::Ok, Self::Error> {
629 Err(ser::Error::custom("unreachable"))
630 }
631
632 fn serialize_f32(self, _value: f32) -> Result<Self::Ok, Self::Error> {
633 Err(ser::Error::custom("unreachable"))
634 }
635
636 fn serialize_f64(self, _value: f64) -> Result<Self::Ok, Self::Error> {
637 Err(ser::Error::custom("unreachable"))
638 }
639
640 fn serialize_char(self, _value: char) -> Result<Self::Ok, Self::Error> {
641 Err(ser::Error::custom("unreachable"))
642 }
643
644 fn serialize_str(self, _value: &str) -> Result<Self::Ok, Self::Error> {
645 Err(ser::Error::custom("unreachable"))
646 }
647
648 fn serialize_bytes(self, value: &[u8]) -> Result<Self::Ok, Self::Error> {
649 let prefixed = [&[0x00], value].concat();
651 types::Tag(CBOR_TAGS_CID, types::Bytes(&prefixed[..]))
653 .encode(&mut self.0.writer)?;
654 Ok(())
655 }
656
657 fn serialize_none(self) -> Result<Self::Ok, Self::Error> {
658 Err(ser::Error::custom("unreachable"))
659 }
660
661 fn serialize_some<T: ?Sized + ser::Serialize>(
662 self,
663 _value: &T,
664 ) -> Result<Self::Ok, Self::Error> {
665 Err(ser::Error::custom("unreachable"))
666 }
667
668 fn serialize_unit(self) -> Result<Self::Ok, Self::Error> {
669 Err(ser::Error::custom("unreachable"))
670 }
671
672 fn serialize_unit_struct(self, _name: &str) -> Result<Self::Ok, Self::Error> {
673 Err(ser::Error::custom("unreachable"))
674 }
675
676 fn serialize_unit_variant(
677 self,
678 _name: &str,
679 _variant_index: u32,
680 _variant: &str,
681 ) -> Result<Self::Ok, Self::Error> {
682 Err(ser::Error::custom("unreachable"))
683 }
684
685 fn serialize_newtype_struct<T: ?Sized + ser::Serialize>(
686 self,
687 _name: &str,
688 _value: &T,
689 ) -> Result<Self::Ok, Self::Error> {
690 Err(ser::Error::custom("unreachable"))
691 }
692
693 fn serialize_newtype_variant<T: ?Sized + ser::Serialize>(
694 self,
695 _name: &str,
696 _variant_index: u32,
697 _variant: &str,
698 _value: &T,
699 ) -> Result<Self::Ok, Self::Error> {
700 Err(ser::Error::custom("unreachable"))
701 }
702
703 fn serialize_seq(
704 self,
705 _len: Option<usize>,
706 ) -> Result<Self::SerializeSeq, Self::Error> {
707 Err(ser::Error::custom("unreachable"))
708 }
709
710 fn serialize_tuple(
711 self,
712 _len: usize,
713 ) -> Result<Self::SerializeTuple, Self::Error> {
714 Err(ser::Error::custom("unreachable"))
715 }
716
717 fn serialize_tuple_struct(
718 self,
719 _name: &str,
720 _len: usize,
721 ) -> Result<Self::SerializeTupleStruct, Self::Error> {
722 Err(ser::Error::custom("unreachable"))
723 }
724
725 fn serialize_tuple_variant(
726 self,
727 _name: &str,
728 _variant_index: u32,
729 _variant: &str,
730 _len: usize,
731 ) -> Result<Self::SerializeTupleVariant, Self::Error> {
732 Err(ser::Error::custom("unreachable"))
733 }
734
735 fn serialize_map(
736 self,
737 _len: Option<usize>,
738 ) -> Result<Self::SerializeMap, Self::Error> {
739 Err(ser::Error::custom("unreachable"))
740 }
741
742 fn serialize_struct(
743 self,
744 _name: &str,
745 _len: usize,
746 ) -> Result<Self::SerializeStruct, Self::Error> {
747 Err(ser::Error::custom("unreachable"))
748 }
749
750 fn serialize_struct_variant(
751 self,
752 _name: &str,
753 _variant_index: u32,
754 _variant: &str,
755 _len: usize,
756 ) -> Result<Self::SerializeStructVariant, Self::Error> {
757 Err(ser::Error::custom("unreachable"))
758 }
759}