1use crate::error::Error;
2use crate::prelude::*;
3use crate::registry::*;
4use bytes::BufMut;
5use core::fmt::Debug;
6
7use serde::{ser, Serialize};
8
9type Result<T> = core::result::Result<T, Error>;
10
11#[inline]
13pub fn to_vec<T>(value: &T) -> Result<Vec<u8>>
14where
15 T: Serialize + ?Sized,
16{
17 let mut out = vec![];
18 to_bytes(&mut out, value)?;
19 Ok(out)
20}
21
22#[inline]
24pub fn to_vec_with_info<T>(value: &T, registry_type: Option<(&Registry, TypeId)>) -> Result<Vec<u8>>
25where
26 T: Serialize + ?Sized,
27{
28 let mut out = vec![];
29 to_bytes_with_info(&mut out, value, registry_type)?;
30 Ok(out)
31}
32
33pub fn to_bytes<B, T>(bytes: B, value: &T) -> Result<()>
35where
36 T: Serialize + ?Sized,
37 B: BufMut + Debug,
38{
39 to_bytes_with_info(bytes, value, None)
40}
41
42pub fn to_bytes_with_info<B, T>(
44 bytes: B,
45 value: &T,
46 registry_type: Option<(&Registry, TypeId)>,
47) -> Result<()>
48where
49 T: Serialize + ?Sized,
50 B: BufMut + Debug,
51{
52 let mut serializer = Serializer::new(bytes, registry_type);
53 value.serialize(&mut serializer)?;
54 Ok(())
55}
56
57#[cfg(feature = "json")]
59pub fn to_bytes_from_iter<B, K, V>(
60 bytes: B,
61 iter: impl IntoIterator<Item = (K, V)>,
62 registry_type: (&Registry, TypeId),
63) -> Result<()>
64where
65 B: BufMut + Debug,
66 K: Into<String>,
67 V: Into<crate::JsonValue>,
68{
69 let ty = registry_type
70 .0
71 .resolve(registry_type.1)
72 .ok_or_else(|| Error::BadInput("Type not in registry".into()))?;
73 let obj = iter.into_iter().collect::<crate::JsonValue>();
74 let val: crate::JsonValue = if let TypeDef::Struct(ref fields) = *ty {
75 fields
76 .iter()
77 .map(|f| {
78 Ok((
79 &*f.name,
80 obj.get(&f.name)
81 .ok_or_else(|| Error::BadInput(format!("missing field {}", f.name)))?
82 .clone(),
83 ))
84 })
85 .collect::<Result<_>>()?
86 } else {
87 return Err(Error::BadType(format!("{:?}", ty)));
88 };
89
90 to_bytes_with_info(bytes, &val, Some(registry_type))
91}
92
93#[cfg(feature = "json")]
95pub fn to_vec_from_iter<I, K, V>(iter: I, registry_type: (&Registry, TypeId)) -> Result<Vec<u8>>
96where
97 I: IntoIterator<Item = (K, V)>,
98 K: Into<String>,
99 V: Into<crate::JsonValue>,
100{
101 let mut out = vec![];
102 to_bytes_from_iter(&mut out, iter, registry_type)?;
103 Ok(out)
104}
105
106#[derive(Debug)]
109pub struct Serializer<'reg, B>
110where
111 B: Debug,
112{
113 out: B,
114 ty_id: Option<TypeId>,
115 ty_hint: Option<TypeDef>,
117 registry: Option<&'reg Registry>,
118 picked: Option<usize>,
119}
120
121impl<'reg, B> Serializer<'reg, B>
122where
123 B: BufMut + Debug,
124{
125 pub fn new(out: B, registry_type: Option<(&'reg Registry, TypeId)>) -> Self {
126 let (registry, ty_id) = match registry_type {
127 Some((reg, ty_id)) => (Some(reg), Some(ty_id)),
128 None => (None, None),
129 };
130 Serializer {
131 out,
132 ty_id,
133 ty_hint: None,
134 registry,
135 picked: None,
136 }
137 }
138
139 fn serialize_compact(&mut self, _ty: u32, v: u128) -> Result<()> {
140 crate::compact_encode(v, &mut self.out);
141 Ok(())
142 }
143}
144
145impl<'a, 'reg, B> ser::Serializer for &'a mut Serializer<'reg, B>
146where
147 B: BufMut + Debug,
148{
149 type Ok = ();
150 type Error = Error;
151
152 type SerializeSeq = TypedSerializer<'a, 'reg, B>;
153 type SerializeTuple = TypedSerializer<'a, 'reg, B>;
154 type SerializeTupleStruct = TypedSerializer<'a, 'reg, B>;
155 type SerializeTupleVariant = TypedSerializer<'a, 'reg, B>;
156 type SerializeMap = TypedSerializer<'a, 'reg, B>;
157 type SerializeStruct = TypedSerializer<'a, 'reg, B>;
158 type SerializeStructVariant = TypedSerializer<'a, 'reg, B>;
159
160 fn serialize_bool(self, v: bool) -> Result<Self::Ok> {
161 self.maybe_some()?;
162 self.out.put_u8(v.into());
163 Ok(())
164 }
165
166 fn serialize_i8(self, v: i8) -> Result<Self::Ok> {
167 self.maybe_some()?;
168 self.out.put_i8(v);
169 Ok(())
170 }
171
172 fn serialize_i16(self, v: i16) -> Result<Self::Ok> {
173 self.maybe_some()?;
174 self.out.put_i16_le(v);
175 Ok(())
176 }
177
178 fn serialize_i32(self, v: i32) -> Result<Self::Ok> {
179 self.maybe_some()?;
180 self.out.put_i32_le(v);
181 Ok(())
182 }
183
184 fn serialize_i64(self, v: i64) -> Result<Self::Ok> {
185 match self.ty() {
186 Some(TypeDef::I8) => self.serialize_i8(v as i8)?,
187 Some(TypeDef::I16) => self.serialize_i16(v as i16)?,
188 Some(TypeDef::I32) => self.serialize_i32(v as i32)?,
189 _ => {
190 self.maybe_some()?;
191 self.out.put_i64_le(v)
192 }
193 }
194 Ok(())
195 }
196
197 fn serialize_u8(self, v: u8) -> Result<Self::Ok> {
198 self.maybe_some()?;
199 self.out.put_u8(v);
200 Ok(())
201 }
202
203 fn serialize_u16(self, v: u16) -> Result<Self::Ok> {
204 self.maybe_some()?;
205 self.out.put_u16_le(v);
206 Ok(())
207 }
208
209 fn serialize_u32(self, v: u32) -> Result<Self::Ok> {
210 self.maybe_some()?;
211 self.out.put_u32_le(v);
212 Ok(())
213 }
214
215 fn serialize_u64(self, v: u64) -> Result<Self::Ok> {
216 self.maybe_some()?;
217 match self.ty() {
219 Some(TypeDef::I8) => self.serialize_i8(v as i8)?,
220 Some(TypeDef::I16) => self.serialize_i16(v as i16)?,
221 Some(TypeDef::I32) => self.serialize_i32(v as i32)?,
222 Some(TypeDef::U8) => self.serialize_u8(v as u8)?,
223 Some(TypeDef::U16) => self.serialize_u16(v as u16)?,
224 Some(TypeDef::U32) => self.serialize_u32(v as u32)?,
225 Some(TypeDef::Compact(ty)) => self.serialize_compact(*ty, v as u128)?,
226 _ => self.out.put_u64_le(v),
227 }
228 Ok(())
229 }
230
231 fn serialize_u128(self, v: u128) -> Result<Self::Ok> {
232 self.maybe_some()?;
233 match self.ty() {
234 Some(TypeDef::I8) => self.serialize_i8(v as i8)?,
235 Some(TypeDef::I16) => self.serialize_i16(v as i16)?,
236 Some(TypeDef::I32) => self.serialize_i32(v as i32)?,
237 Some(TypeDef::I64) => self.serialize_i64(v as i64)?,
238 Some(TypeDef::U8) => self.serialize_u8(v as u8)?,
239 Some(TypeDef::U16) => self.serialize_u16(v as u16)?,
240 Some(TypeDef::U32) => self.serialize_u32(v as u32)?,
241 Some(TypeDef::U64) => self.serialize_u64(v as u64)?,
242 Some(TypeDef::Compact(ty)) => self.serialize_compact(*ty, v)?,
243 _ => self.out.put_u128_le(v),
244 }
245 Ok(())
246 }
247
248 fn serialize_f32(self, _v: f32) -> Result<Self::Ok> {
249 unimplemented!()
250 }
251
252 fn serialize_f64(self, _v: f64) -> Result<Self::Ok> {
253 unimplemented!()
254 }
255
256 fn serialize_char(self, _v: char) -> Result<Self::Ok> {
257 unimplemented!()
258 }
259
260 fn serialize_str(self, v: &str) -> Result<Self::Ok> {
261 self.maybe_some()?;
262 if self.maybe_other(v)?.is_some() {
263 return Ok(());
264 }
265
266 compact_number(v.len(), &mut self.out);
267 self.out.put(v.as_bytes());
268 Ok(())
269 }
270
271 fn serialize_bytes(self, v: &[u8]) -> Result<Self::Ok> {
272 self.maybe_some()?;
273
274 compact_number(v.len(), &mut self.out);
275 self.out.put(v);
276 Ok(())
277 }
278
279 fn serialize_none(self) -> Result<Self::Ok> {
280 self.out.put_u8(0x00);
281 Ok(())
282 }
283
284 fn serialize_some<T>(self, value: &T) -> Result<Self::Ok>
285 where
286 T: Serialize + ?Sized,
287 {
288 self.out.put_u8(0x01);
289 value.serialize(self)
290 }
291
292 fn serialize_unit(self) -> Result<Self::Ok> {
293 self.maybe_some()?;
294 Ok(())
295 }
296
297 fn serialize_unit_struct(self, _name: &'static str) -> Result<Self::Ok> {
298 self.maybe_some()?;
299 Ok(())
300 }
301
302 fn serialize_unit_variant(
303 self,
304 __name: &'static str,
305 variant_index: u32,
306 _variant: &'static str,
307 ) -> Result<Self::Ok> {
308 self.maybe_some()?;
309 (variant_index as u8).serialize(self)
310 }
311
312 fn serialize_newtype_struct<T>(self, _name: &'static str, value: &T) -> Result<Self::Ok>
313 where
314 T: Serialize + ?Sized,
315 {
316 self.maybe_some()?;
317 value.serialize(self)
318 }
319
320 fn serialize_newtype_variant<T>(
321 self,
322 __name: &'static str,
323 variant_index: u32,
324 _variant: &'static str,
325 value: &T,
326 ) -> Result<Self::Ok>
327 where
328 T: Serialize + ?Sized,
329 {
330 self.maybe_some()?;
331 self.out.put_u8(variant_index as u8);
332 value.serialize(self)
333 }
334
335 fn serialize_seq(self, len: Option<usize>) -> Result<Self::SerializeSeq> {
336 self.maybe_some()?;
337 if matches!(
338 self.ty(),
339 None | Some(TypeDef::Bytes) | Some(TypeDef::Sequence(_))
340 ) {
341 compact_number(len.expect("known length"), &mut self.out);
342 }
343 Ok(self.into())
344 }
345
346 fn serialize_tuple(self, _len: usize) -> Result<Self::SerializeTuple> {
347 self.maybe_some()?;
348 Ok(self.into())
349 }
350
351 fn serialize_tuple_struct(
352 self,
353 __name: &'static str,
354 __len: usize,
355 ) -> Result<Self::SerializeTupleStruct> {
356 self.maybe_some()?;
357 Ok(self.into())
358 }
359
360 fn serialize_tuple_variant(
361 self,
362 __name: &'static str,
363 variant_index: u32,
364 _variant: &'static str,
365 __len: usize,
366 ) -> Result<Self::SerializeTupleVariant> {
367 self.maybe_some()?;
368 self.out.put_u8(variant_index as u8);
369 Ok(self.into())
370 }
371
372 fn serialize_map(self, len: Option<usize>) -> Result<Self::SerializeMap> {
373 self.maybe_some()?;
374 if matches!(self.ty(), None | Some(TypeDef::Map(_, _))) {
375 compact_number(len.expect("known length"), &mut self.out);
376 }
377 Ok(self.into())
378 }
379
380 fn serialize_struct(self, _name: &'static str, _len: usize) -> Result<Self::SerializeStruct> {
381 self.maybe_some()?;
382 Ok(self.into())
383 }
384
385 fn serialize_struct_variant(
386 self,
387 __name: &'static str,
388 variant_index: u32,
389 _variant: &'static str,
390 __len: usize,
391 ) -> Result<Self::SerializeStructVariant> {
392 self.maybe_some()?;
393 self.out.put_u8(variant_index as u8);
394 Ok(self.into())
395 }
396}
397
398impl<'reg, B: Debug> Serializer<'reg, B> {
399 fn ty(&self) -> Option<&TypeDef> {
400 self.ty_id
401 .map(|id| self.resolve(id) as &TypeDef)
402 .or(self.ty_hint.as_ref())
403 }
404
405 fn resolve(&self, ty_id: TypeId) -> &'reg TypeDef {
406 let reg = self.registry.expect("called having type");
407 reg.resolve(ty_id).expect("in registry")
408 }
409}
410
411impl<'reg, B> Serializer<'reg, B>
412where
413 B: BufMut + Debug,
414{
415 fn maybe_some(&mut self) -> Result<()> {
418 if let Some(ty_id) = self.ty_id {
419 if let TypeDef::Variant(vdef) = self.resolve(ty_id) {
420 if vdef.name == "Option" {
421 self.ty_id = match &vdef.variants[1].fields {
422 Fields::NewType(inner) => Some(*inner),
423 _ => None,
424 };
425 self.out.put_u8(0x01);
426 }
427 }
428 }
429 Ok(())
430 }
431
432 #[inline]
433 fn maybe_other(&mut self, val: &str) -> Result<Option<()>> {
434 let ty = match self.ty() {
435 Some(ty) => ty,
436 None => return Ok(None),
437 };
438 match ty {
439 TypeDef::Str => Ok(None),
440 TypeDef::Variant(vdef) => {
442 let variant = vdef
443 .variants
444 .iter()
445 .find(|v| v.name == val)
446 .ok_or_else(|| Error::BadInput("Invalid variant".into()))?;
447 self.out.put_u8(variant.index);
448 Ok(Some(()))
449 }
450 TypeDef::StructNewType(ty_id) => match self.resolve(*ty_id) {
451 TypeDef::Str => Ok(None),
453 ty => Err(Error::NotSupported(
454 type_name_of_val(val),
455 format!("{:?}", ty),
456 )),
457 },
458 TypeDef::U8 => {
459 let n = val.parse().map_err(|_| Error::BadInput("u8".into()))?;
460 self.out.put_u8(n);
461 Ok(Some(()))
462 }
463 TypeDef::U16 => {
464 let n = val.parse().map_err(|_| Error::BadInput("u16".into()))?;
465 self.out.put_u16_le(n);
466 Ok(Some(()))
467 }
468 TypeDef::U32 => {
469 let n = val.parse().map_err(|_| Error::BadInput("u32".into()))?;
470 self.out.put_u32_le(n);
471 Ok(Some(()))
472 }
473 TypeDef::U64 => {
474 let n = val.parse().map_err(|_| Error::BadInput("u64".into()))?;
475 self.out.put_u64_le(n);
476 Ok(Some(()))
477 }
478 TypeDef::U128 => {
479 let n = val.parse().map_err(|_| Error::BadInput("u128".into()))?;
480 self.out.put_u128_le(n);
481 Ok(Some(()))
482 }
483 TypeDef::I8 => {
484 let n = val.parse().map_err(|_| Error::BadInput("i8".into()))?;
485 self.out.put_i8(n);
486 Ok(Some(()))
487 }
488 TypeDef::I16 => {
489 let n = val.parse().map_err(|_| Error::BadInput("i16".into()))?;
490 self.out.put_i16_le(n);
491 Ok(Some(()))
492 }
493 TypeDef::I32 => {
494 let n = val.parse().map_err(|_| Error::BadInput("i32".into()))?;
495 self.out.put_i32_le(n);
496 Ok(Some(()))
497 }
498 TypeDef::I64 => {
499 let n = val.parse().map_err(|_| Error::BadInput("i64".into()))?;
500 self.out.put_i64_le(n);
501 Ok(Some(()))
502 }
503 TypeDef::I128 => {
504 let n = val.parse().map_err(|_| Error::BadInput("i128".into()))?;
505 self.out.put_i128_le(n);
506 Ok(Some(()))
507 }
508 TypeDef::Bytes => {
509 if let Some(hex) = val.strip_prefix("0x") {
510 let bytes = crate::decode_hex(hex)?;
511 ser::Serializer::serialize_bytes(self, &bytes)?;
512 Ok(Some(()))
513 } else {
514 Err(Error::BadInput("Hex string must start with 0x".into()))
515 }
516 }
517 ty => Err(Error::NotSupported(
518 type_name_of_val(val),
519 format!("{:?}", ty),
520 )),
521 }
522 }
523}
524
525#[derive(Debug)]
527pub enum FieldTypes<'reg> {
528 Ids(&'reg [TypeId]),
529 Fields(&'reg [Field]),
530}
531
532impl FieldTypes<'_> {
533 fn next(&mut self) -> TypeId {
534 match self {
535 FieldTypes::Ids(ids) => {
536 let (first, rest) = ids.split_first().expect("field available");
537 *ids = rest;
538 *first
539 }
540 FieldTypes::Fields(fields) => {
541 let (first, rest) = fields.split_first().expect("field available");
542 *fields = rest;
543 first.ty
544 }
545 }
546 }
547}
548
549#[derive(Debug)]
550pub enum TypedSerializer<'a, 'reg, B>
551where
552 B: Debug,
553{
554 Empty(&'a mut Serializer<'reg, B>),
555 Composite(&'a mut Serializer<'reg, B>, FieldTypes<'reg>),
556 Sequence(&'a mut Serializer<'reg, B>, TypeId),
557 ByteSeq(&'a mut Serializer<'reg, B>),
558 Enum(&'a mut Serializer<'reg, B>),
559}
560
561impl<'a, 'reg, B: 'a> From<&'a mut Serializer<'reg, B>> for TypedSerializer<'a, 'reg, B>
562where
563 B: Debug,
564{
565 fn from(ser: &'a mut Serializer<'reg, B>) -> Self {
566 let ty_id = match ser.ty_id.take() {
567 Some(id) => id,
568 None => return Self::Empty(ser),
569 };
570 let ty = ser.resolve(ty_id);
571 match ty {
572 TypeDef::Struct(ref fields) => Self::Composite(ser, FieldTypes::Fields(fields)),
573 TypeDef::StructTuple(ref ids) => Self::Composite(ser, FieldTypes::Ids(ids)),
574 TypeDef::Array(ty, _) => Self::Sequence(ser, *ty),
575 TypeDef::Tuple(ref ids) => Self::Composite(ser, FieldTypes::Ids(ids)),
576 TypeDef::Sequence(ty) => Self::Sequence(ser, *ty),
577 TypeDef::Bytes => Self::ByteSeq(ser),
578 TypeDef::Map(_, _) => Self::Empty(ser),
579 TypeDef::Variant(ref vdef) => {
580 if let Some(idx) = ser.picked.take() {
581 match &vdef.variants[idx].fields {
582 Fields::Tuple(types) => Self::Composite(ser, FieldTypes::Ids(types)),
583 Fields::Struct(fields) => Self::Composite(ser, FieldTypes::Fields(fields)),
584 _ => Self::Empty(ser),
585 }
586 } else {
587 ser.ty_id = Some(ty_id);
588 Self::Enum(ser)
589 }
590 }
591 _ => Self::Empty(ser),
592 }
593 }
594}
595
596impl<'reg, B> TypedSerializer<'_, 'reg, B>
597where
598 B: Debug,
599{
600 fn serializer(&mut self) -> &mut Serializer<'reg, B> {
601 match self {
602 Self::Empty(ser)
603 | Self::Composite(ser, _)
604 | Self::Enum(ser)
605 | Self::Sequence(ser, _)
606 | Self::ByteSeq(ser) => ser,
607 }
608 }
609}
610
611fn unwrap_newtype(reg: &Registry, ty_id: TypeId) -> TypeId {
613 match reg.resolve(ty_id).expect("in registry") {
614 TypeDef::StructNewType(inner) => *inner,
615 _ => ty_id,
616 }
617}
618
619impl<B> ser::SerializeMap for TypedSerializer<'_, '_, B>
620where
621 B: BufMut + Debug,
622{
623 type Ok = ();
624 type Error = Error;
625
626 fn serialize_key<T>(&mut self, key: &T) -> Result<()>
627 where
628 T: Serialize + ?Sized,
629 {
630 match self {
631 TypedSerializer::Enum(ser) => {
632 if let Some(ty_id) = ser.ty_id {
633 if let TypeDef::Variant(vdef) = ser.resolve(ty_id) {
634 let key_data = to_vec(key)?;
635 let idx = vdef
636 .variants
637 .iter()
638 .position(|v| to_vec(&v.name).is_ok_and(|d| d == key_data))
639 .ok_or_else(|| Error::BadInput("Invalid variant".into()))?;
640 let variant_index = vdef.variants[idx].index;
641 ser.picked = Some(idx);
642 variant_index.serialize(&mut **ser)?;
643 }
644 }
645 Ok(())
646 }
647 TypedSerializer::Empty(ser) => key.serialize(&mut **ser),
648 _ => Ok(()),
649 }
650 }
651
652 fn serialize_value<T>(&mut self, value: &T) -> Result<()>
653 where
654 T: Serialize + ?Sized,
655 {
656 match self {
657 TypedSerializer::Composite(ser, field_types) => {
658 let reg = ser.registry.expect("called having type");
659 ser.ty_id = Some(unwrap_newtype(reg, field_types.next()));
660 ser.ty_hint = None;
661 }
662 TypedSerializer::Enum(ser) => {
663 if let Some(ty_id) = ser.ty_id {
664 if let TypeDef::Variant(vdef) = ser.resolve(ty_id) {
665 if let Some(idx) = ser.picked {
666 if let Fields::NewType(field_ty_id) = &vdef.variants[idx].fields {
667 let reg = ser.registry.expect("called having type");
668 ser.ty_id = Some(unwrap_newtype(reg, *field_ty_id));
669 ser.ty_hint = None;
670 ser.picked = None;
671 }
672 }
673 }
674 }
675 }
676 _ => {}
677 }
678 value.serialize(self.serializer())
679 }
680
681 fn end(self) -> Result<Self::Ok> {
682 Ok(())
683 }
684}
685
686impl<B> ser::SerializeSeq for TypedSerializer<'_, '_, B>
687where
688 B: BufMut + Debug,
689{
690 type Ok = ();
691 type Error = Error;
692
693 fn serialize_element<T>(&mut self, value: &T) -> Result<()>
694 where
695 T: Serialize + ?Sized,
696 {
697 match self {
698 TypedSerializer::Composite(ser, field_types) => {
699 let reg = ser.registry.expect("called having type");
700 ser.ty_id = Some(unwrap_newtype(reg, field_types.next()));
701 ser.ty_hint = None;
702 }
703 TypedSerializer::Sequence(ser, ty_id) => {
704 let reg = ser.registry.expect("called having type");
705 ser.ty_id = Some(unwrap_newtype(reg, *ty_id));
706 ser.ty_hint = None;
707 }
708 TypedSerializer::ByteSeq(ser) => {
709 ser.ty_id = None;
710 ser.ty_hint = Some(TypeDef::U8);
711 }
712 _ => {}
713 };
714 value.serialize(self.serializer())
715 }
716
717 fn end(self) -> Result<Self::Ok> {
718 Ok(())
719 }
720}
721
722impl<B> ser::SerializeStruct for TypedSerializer<'_, '_, B>
723where
724 B: BufMut + Debug,
725{
726 type Ok = ();
727 type Error = Error;
728
729 fn serialize_field<T>(&mut self, _key: &'static str, value: &T) -> Result<()>
730 where
731 T: Serialize + ?Sized,
732 {
733 value.serialize(self.serializer())
734 }
735
736 fn end(self) -> Result<Self::Ok> {
737 Ok(())
738 }
739}
740
741impl<B> ser::SerializeStructVariant for TypedSerializer<'_, '_, B>
742where
743 B: BufMut + Debug,
744{
745 type Ok = ();
746 type Error = Error;
747
748 fn serialize_field<T>(&mut self, _key: &'static str, value: &T) -> Result<()>
749 where
750 T: Serialize + ?Sized,
751 {
752 value.serialize(self.serializer())
753 }
754
755 fn end(self) -> Result<Self::Ok> {
756 Ok(())
757 }
758}
759
760impl<B> ser::SerializeTuple for TypedSerializer<'_, '_, B>
761where
762 B: BufMut + Debug,
763{
764 type Ok = ();
765 type Error = Error;
766
767 fn serialize_element<T>(&mut self, value: &T) -> Result<()>
768 where
769 T: Serialize + ?Sized,
770 {
771 value.serialize(self.serializer())
772 }
773
774 fn end(self) -> Result<Self::Ok> {
775 Ok(())
776 }
777}
778
779impl<B> ser::SerializeTupleStruct for TypedSerializer<'_, '_, B>
780where
781 B: BufMut + Debug,
782{
783 type Ok = ();
784 type Error = Error;
785
786 fn serialize_field<T>(&mut self, value: &T) -> Result<()>
787 where
788 T: Serialize + ?Sized,
789 {
790 value.serialize(self.serializer())
791 }
792
793 fn end(self) -> Result<Self::Ok> {
794 Ok(())
795 }
796}
797
798impl<B> ser::SerializeTupleVariant for TypedSerializer<'_, '_, B>
799where
800 B: BufMut + Debug,
801{
802 type Ok = ();
803 type Error = Error;
804
805 fn serialize_field<T>(&mut self, value: &T) -> Result<()>
806 where
807 T: Serialize + ?Sized,
808 {
809 value.serialize(self.serializer())
810 }
811
812 fn end(self) -> Result<Self::Ok> {
813 Ok(())
814 }
815}
816
817fn compact_number(n: usize, dest: impl BufMut) {
818 crate::compact_encode(n as u128, dest)
819}
820
821fn type_name_of_val<T: ?Sized>(_val: &T) -> &'static str {
823 core::any::type_name::<T>()
824}