1use core::marker::PhantomData;
4
5use serde::Serialize;
6use thiserror::Error;
7use wincode::{SchemaWrite, error::WriteError, io::Writer};
8
9#[cfg(not(feature = "alloc"))]
10const CANNOT_COLLECT_STR: &str = "`serde::Serializer::collect_str` got called, but serde-wincode was unable to allocate memory";
11
12const SEQUENCE_MUST_HAVE_LENGTH: &str = "Serde provided serde-wincode with a sequence without a length, which is not supported in wincode";
13
14const SERDE_ERROR: &str = "serde error";
15
16#[derive(Debug, Error)]
17pub enum Error {
18 #[cfg(not(feature = "alloc"))]
21 #[error("{CANNOT_COLLECT_STR}")]
22 CannotCollectStr,
23 #[cfg(feature = "alloc")]
24 #[error("{msg}")]
25 CustomSerde { msg: alloc::string::String },
26 #[cfg(not(feature = "alloc"))]
27 #[error("{SERDE_ERROR}")]
28 CustomSerde,
29 #[error("{SEQUENCE_MUST_HAVE_LENGTH}")]
32 SequenceMustHaveLength,
33 #[error(transparent)]
34 Write(#[from] WriteError),
35}
36
37impl From<Error> for WriteError {
38 fn from(err: Error) -> Self {
39 match err {
40 #[cfg(not(feature = "alloc"))]
41 Error::CannotCollectStr => Self::Custom(CANNOT_COLLECT_STR),
42 #[cfg(feature = "alloc")]
43 Error::CustomSerde { msg: _ } => Self::Custom(SERDE_ERROR),
44 #[cfg(not(feature = "alloc"))]
45 Error::CustomSerde => Self::Custom(SERDE_ERROR),
46 Error::SequenceMustHaveLength => {
47 Self::Custom(SEQUENCE_MUST_HAVE_LENGTH)
48 }
49 Error::Write(err) => err,
50 }
51 }
52}
53
54impl serde::ser::Error for Error {
55 #[cfg(feature = "alloc")]
56 fn custom<T>(msg: T) -> Self
57 where
58 T: core::fmt::Display,
59 {
60 Self::CustomSerde {
61 msg: alloc::string::ToString::to_string(&msg),
62 }
63 }
64
65 #[cfg(not(feature = "alloc"))]
66 fn custom<T>(_msg: T) -> Self
67 where
68 T: core::fmt::Display,
69 {
70 Self::CustomSerde
71 }
72}
73
74pub struct Serializer<W, C = wincode::config::Configuration> {
75 inner: W,
76 marker: PhantomData<C>,
77}
78
79impl<W, C> Serializer<W, C> {
80 pub fn new(writer: W) -> Self {
81 Self {
82 inner: writer,
83 marker: PhantomData,
84 }
85 }
86
87 fn as_mut(&mut self) -> Serializer<&mut W, C> {
88 Serializer {
89 inner: &mut self.inner,
90 marker: self.marker,
91 }
92 }
93}
94
95macro_rules! impl_fn_serializer {
96 ($serialize_method:ident, $serialize_ty:ty) => {
97 fn $serialize_method(
98 self,
99 value: $serialize_ty,
100 ) -> Result<Self::Ok, Self::Error> {
101 <$serialize_ty as SchemaWrite<C>>::write(self.inner, &value)
102 .map_err(Self::Error::Write)
103 }
104 };
105}
106
107impl<W, C> serde::Serializer for Serializer<W, C>
108where
109 C: wincode::config::Config,
110 W: Writer,
111{
112 type Ok = ();
113 type Error = Error;
114
115 type SerializeSeq = Self;
116 type SerializeTuple = Self;
117 type SerializeTupleStruct = Self;
118 type SerializeTupleVariant = Self;
119 type SerializeMap = Self;
120 type SerializeStruct = Self;
121 type SerializeStructVariant = Self;
122
123 impl_fn_serializer!(serialize_bool, bool);
124 impl_fn_serializer!(serialize_i8, i8);
125 impl_fn_serializer!(serialize_i16, i16);
126 impl_fn_serializer!(serialize_i32, i32);
127 impl_fn_serializer!(serialize_i64, i64);
128 impl_fn_serializer!(serialize_u8, u8);
129 impl_fn_serializer!(serialize_u16, u16);
130 impl_fn_serializer!(serialize_u32, u32);
131 impl_fn_serializer!(serialize_u64, u64);
132 impl_fn_serializer!(serialize_f32, f32);
133 impl_fn_serializer!(serialize_f64, f64);
134 impl_fn_serializer!(serialize_char, char);
135 impl_fn_serializer!(serialize_str, &str);
136 impl_fn_serializer!(serialize_bytes, &[u8]);
137
138 fn serialize_none(self) -> Result<Self::Ok, Self::Error> {
139 <u8 as SchemaWrite<C>>::write(self.inner, &0u8)
140 .map_err(Self::Error::Write)
141 }
142
143 fn serialize_some<T>(mut self, value: &T) -> Result<Self::Ok, Self::Error>
144 where
145 T: Serialize + ?Sized,
146 {
147 <u8 as SchemaWrite<C>>::write(&mut self.inner, &1u8)?;
148 value.serialize(self)
149 }
150
151 fn serialize_unit(self) -> Result<Self::Ok, Self::Error> {
152 Ok(())
153 }
154
155 fn serialize_unit_struct(
156 self,
157 _name: &'static str,
158 ) -> Result<Self::Ok, Self::Error> {
159 Ok(())
160 }
161
162 fn serialize_unit_variant(
163 self,
164 _name: &'static str,
165 variant_index: u32,
166 _variant: &'static str,
167 ) -> Result<Self::Ok, Self::Error> {
168 <u32 as SchemaWrite<C>>::write(self.inner, &variant_index)
169 .map_err(Self::Error::Write)
170 }
171
172 fn serialize_newtype_struct<T>(
173 self,
174 _name: &'static str,
175 value: &T,
176 ) -> Result<Self::Ok, Self::Error>
177 where
178 T: Serialize + ?Sized,
179 {
180 value.serialize(self)
181 }
182
183 fn serialize_newtype_variant<T>(
184 mut self,
185 _name: &'static str,
186 variant_index: u32,
187 _variant: &'static str,
188 value: &T,
189 ) -> Result<Self::Ok, Self::Error>
190 where
191 T: Serialize + ?Sized,
192 {
193 <u32 as SchemaWrite<C>>::write(&mut self.inner, &variant_index)?;
194 value.serialize(self)
195 }
196
197 fn serialize_seq(
198 mut self,
199 len: Option<usize>,
200 ) -> Result<Self::SerializeSeq, Self::Error> {
201 let len = len.ok_or(Self::Error::SequenceMustHaveLength)?;
202 <usize as SchemaWrite<C>>::write(&mut self.inner, &len)?;
203 Ok(self)
204 }
205
206 fn serialize_tuple(
207 self,
208 _: usize,
209 ) -> Result<Self::SerializeTuple, Self::Error> {
210 Ok(self)
211 }
212
213 fn serialize_tuple_struct(
214 self,
215 _name: &'static str,
216 _len: usize,
217 ) -> Result<Self::SerializeTupleStruct, Self::Error> {
218 Ok(self)
219 }
220
221 fn serialize_tuple_variant(
222 mut self,
223 _name: &'static str,
224 variant_index: u32,
225 _variant: &'static str,
226 _len: usize,
227 ) -> Result<Self::SerializeTupleVariant, Self::Error> {
228 <u32 as SchemaWrite<C>>::write(&mut self.inner, &variant_index)?;
229 Ok(self)
230 }
231
232 fn serialize_map(
233 mut self,
234 len: Option<usize>,
235 ) -> Result<Self::SerializeMap, Self::Error> {
236 let len = len.ok_or(Self::Error::SequenceMustHaveLength)?;
237 <usize as SchemaWrite<C>>::write(&mut self.inner, &len)?;
238 Ok(self)
239 }
240
241 fn serialize_struct(
242 self,
243 _name: &'static str,
244 _len: usize,
245 ) -> Result<Self::SerializeStruct, Self::Error> {
246 Ok(self)
247 }
248
249 fn serialize_struct_variant(
250 mut self,
251 _name: &'static str,
252 variant_index: u32,
253 _variant: &'static str,
254 _len: usize,
255 ) -> Result<Self::SerializeStructVariant, Self::Error> {
256 <u32 as SchemaWrite<C>>::write(&mut self.inner, &variant_index)?;
257 Ok(self)
258 }
259
260 #[cfg(not(feature = "alloc"))]
261 fn collect_str<T>(self, _: &T) -> Result<Self::Ok, Self::Error>
262 where
263 T: core::fmt::Display + ?Sized,
264 {
265 Err(Self::Error::CannotCollectStr)
266 }
267
268 fn is_human_readable(&self) -> bool {
269 false
270 }
271}
272
273impl<W, C> serde::ser::SerializeSeq for Serializer<W, C>
274where
275 C: wincode::config::Config,
276 W: Writer,
277{
278 type Ok = ();
279 type Error = Error;
280
281 fn serialize_element<T>(&mut self, value: &T) -> Result<(), Self::Error>
282 where
283 T: Serialize + ?Sized,
284 {
285 value.serialize(self.as_mut())
286 }
287
288 fn end(self) -> Result<Self::Ok, Self::Error> {
289 Ok(())
290 }
291}
292
293impl<W, C> serde::ser::SerializeTuple for Serializer<W, C>
294where
295 C: wincode::config::Config,
296 W: Writer,
297{
298 type Ok = ();
299 type Error = Error;
300
301 fn serialize_element<T>(&mut self, value: &T) -> Result<(), Self::Error>
302 where
303 T: Serialize + ?Sized,
304 {
305 value.serialize(self.as_mut())
306 }
307
308 fn end(self) -> Result<Self::Ok, Self::Error> {
309 Ok(())
310 }
311}
312
313impl<W, C> serde::ser::SerializeTupleStruct for Serializer<W, C>
314where
315 C: wincode::config::Config,
316 W: Writer,
317{
318 type Ok = ();
319 type Error = Error;
320
321 fn serialize_field<T>(&mut self, value: &T) -> Result<(), Self::Error>
322 where
323 T: Serialize + ?Sized,
324 {
325 value.serialize(self.as_mut())
326 }
327
328 fn end(self) -> Result<Self::Ok, Self::Error> {
329 Ok(())
330 }
331}
332
333impl<W, C> serde::ser::SerializeTupleVariant for Serializer<W, C>
334where
335 C: wincode::config::Config,
336 W: Writer,
337{
338 type Ok = ();
339 type Error = Error;
340
341 fn serialize_field<T>(&mut self, value: &T) -> Result<(), Self::Error>
342 where
343 T: Serialize + ?Sized,
344 {
345 value.serialize(self.as_mut())
346 }
347
348 fn end(self) -> Result<Self::Ok, Self::Error> {
349 Ok(())
350 }
351}
352
353impl<W, C> serde::ser::SerializeMap for Serializer<W, C>
354where
355 C: wincode::config::Config,
356 W: Writer,
357{
358 type Ok = ();
359 type Error = Error;
360
361 fn serialize_key<T>(&mut self, key: &T) -> Result<(), Self::Error>
362 where
363 T: Serialize + ?Sized,
364 {
365 key.serialize(self.as_mut())
366 }
367
368 fn serialize_value<T>(&mut self, value: &T) -> Result<(), Self::Error>
369 where
370 T: Serialize + ?Sized,
371 {
372 value.serialize(self.as_mut())
373 }
374
375 fn end(self) -> Result<Self::Ok, Self::Error> {
376 Ok(())
377 }
378}
379
380impl<W, C> serde::ser::SerializeStruct for Serializer<W, C>
381where
382 C: wincode::config::Config,
383 W: Writer,
384{
385 type Ok = ();
386 type Error = Error;
387
388 fn serialize_field<T>(
389 &mut self,
390 _key: &'static str,
391 value: &T,
392 ) -> Result<(), Self::Error>
393 where
394 T: Serialize + ?Sized,
395 {
396 value.serialize(self.as_mut())
397 }
398
399 fn end(self) -> Result<Self::Ok, Self::Error> {
400 Ok(())
401 }
402}
403
404impl<W, C> serde::ser::SerializeStructVariant for Serializer<W, C>
405where
406 C: wincode::config::Config,
407 W: Writer,
408{
409 type Ok = ();
410 type Error = Error;
411
412 fn serialize_field<T>(
413 &mut self,
414 _key: &'static str,
415 value: &T,
416 ) -> Result<(), Self::Error>
417 where
418 T: Serialize + ?Sized,
419 {
420 value.serialize(self.as_mut())
421 }
422
423 fn end(self) -> Result<Self::Ok, Self::Error> {
424 Ok(())
425 }
426}
427
428const SIZE_OVERFLOW: &str = "Overflow when calculating serialized size";
429
430#[derive(Debug, Error)]
431pub enum SizeOfError {
432 #[error(transparent)]
433 Serialize(Error),
434 #[error("{SIZE_OVERFLOW}")]
436 SizeOverflow,
437}
438
439impl<E> From<E> for SizeOfError
440where
441 Error: From<E>,
442{
443 fn from(err: E) -> Self {
444 Self::Serialize(err.into())
445 }
446}
447
448impl From<SizeOfError> for WriteError {
449 fn from(err: SizeOfError) -> Self {
450 match err {
451 SizeOfError::Serialize(err) => err.into(),
452 SizeOfError::SizeOverflow => Self::Custom(SIZE_OVERFLOW),
453 }
454 }
455}
456
457impl serde::ser::Error for SizeOfError {
458 fn custom<T>(msg: T) -> Self
459 where
460 T: core::fmt::Display,
461 {
462 Self::Serialize(Error::custom(msg))
463 }
464}
465
466#[repr(transparent)]
468pub(crate) struct SizeOf<C> {
469 size: usize,
470 marker: PhantomData<C>,
471}
472
473impl<C> SizeOf<C> {
474 pub fn new() -> Self {
475 Self {
476 size: 0,
477 marker: PhantomData,
478 }
479 }
480
481 pub fn serialized_size(&self) -> usize {
483 self.size
484 }
485
486 fn add_size(&mut self, size: usize) -> Result<(), SizeOfError> {
487 self.size = self
488 .size
489 .checked_add(size)
490 .ok_or(SizeOfError::SizeOverflow)?;
491 Ok(())
492 }
493}
494
495macro_rules! impl_fn_sizeof {
496 ($serialize_method:ident, $serialize_ty:ty) => {
497 fn $serialize_method(
498 mut self,
499 value: $serialize_ty,
500 ) -> Result<Self::Ok, Self::Error> {
501 let value_size =
502 <$serialize_ty as SchemaWrite<C>>::size_of(&value)?;
503 self.add_size(value_size)?;
504 Ok(self)
505 }
506 };
507}
508
509impl<C> serde::Serializer for SizeOf<C>
510where
511 C: wincode::config::Config,
512{
513 type Ok = Self;
514 type Error = SizeOfError;
515
516 type SerializeSeq = Self;
517 type SerializeTuple = Self;
518 type SerializeTupleStruct = Self;
519 type SerializeTupleVariant = Self;
520 type SerializeMap = Self;
521 type SerializeStruct = Self;
522 type SerializeStructVariant = Self;
523
524 impl_fn_sizeof!(serialize_bool, bool);
525 impl_fn_sizeof!(serialize_i8, i8);
526 impl_fn_sizeof!(serialize_i16, i16);
527 impl_fn_sizeof!(serialize_i32, i32);
528 impl_fn_sizeof!(serialize_i64, i64);
529 impl_fn_sizeof!(serialize_i128, i128);
530 impl_fn_sizeof!(serialize_u8, u8);
531 impl_fn_sizeof!(serialize_u16, u16);
532 impl_fn_sizeof!(serialize_u32, u32);
533 impl_fn_sizeof!(serialize_u64, u64);
534 impl_fn_sizeof!(serialize_u128, u128);
535 impl_fn_sizeof!(serialize_f32, f32);
536 impl_fn_sizeof!(serialize_f64, f64);
537 impl_fn_sizeof!(serialize_char, char);
538 impl_fn_sizeof!(serialize_str, &str);
539 impl_fn_sizeof!(serialize_bytes, &[u8]);
540
541 fn serialize_none(mut self) -> Result<Self::Ok, Self::Error> {
542 let discriminant_size = <u8 as SchemaWrite<C>>::size_of(&0u8)?;
543 self.add_size(discriminant_size)?;
544 Ok(self)
545 }
546
547 fn serialize_some<T>(mut self, value: &T) -> Result<Self::Ok, Self::Error>
548 where
549 T: Serialize + ?Sized,
550 {
551 let discriminant_size = <u8 as SchemaWrite<C>>::size_of(&1u8)?;
552 self.add_size(discriminant_size)?;
553 value.serialize(self)
554 }
555
556 fn serialize_unit(self) -> Result<Self::Ok, Self::Error> {
557 Ok(self)
558 }
559
560 fn serialize_unit_struct(
561 self,
562 _name: &'static str,
563 ) -> Result<Self::Ok, Self::Error> {
564 Ok(self)
565 }
566
567 fn serialize_unit_variant(
568 mut self,
569 _name: &'static str,
570 variant_index: u32,
571 _variant: &'static str,
572 ) -> Result<Self::Ok, Self::Error> {
573 let variant_index_size =
574 <u32 as SchemaWrite<C>>::size_of(&variant_index)?;
575 self.add_size(variant_index_size)?;
576 Ok(self)
577 }
578
579 fn serialize_newtype_struct<T>(
580 self,
581 _name: &'static str,
582 value: &T,
583 ) -> Result<Self::Ok, Self::Error>
584 where
585 T: Serialize + ?Sized,
586 {
587 value.serialize(self)
588 }
589
590 fn serialize_newtype_variant<T>(
591 mut self,
592 _name: &'static str,
593 variant_index: u32,
594 _variant: &'static str,
595 value: &T,
596 ) -> Result<Self::Ok, Self::Error>
597 where
598 T: Serialize + ?Sized,
599 {
600 let variant_index_size =
601 <u32 as SchemaWrite<C>>::size_of(&variant_index)?;
602 self.add_size(variant_index_size)?;
603 value.serialize(self)
604 }
605
606 fn serialize_seq(
607 mut self,
608 len: Option<usize>,
609 ) -> Result<Self::SerializeSeq, Self::Error> {
610 let len = len.ok_or(Error::SequenceMustHaveLength)?;
611 let len_size = <usize as SchemaWrite<C>>::size_of(&len)?;
612 self.add_size(len_size)?;
613 Ok(self)
614 }
615
616 fn serialize_tuple(
617 self,
618 _: usize,
619 ) -> Result<Self::SerializeTuple, Self::Error> {
620 Ok(self)
621 }
622
623 fn serialize_tuple_struct(
624 self,
625 _name: &'static str,
626 _len: usize,
627 ) -> Result<Self::SerializeTupleStruct, Self::Error> {
628 Ok(self)
629 }
630
631 fn serialize_tuple_variant(
632 mut self,
633 _name: &'static str,
634 variant_index: u32,
635 _variant: &'static str,
636 _len: usize,
637 ) -> Result<Self::SerializeTupleVariant, Self::Error> {
638 let variant_index_size =
639 <u32 as SchemaWrite<C>>::size_of(&variant_index)?;
640 self.add_size(variant_index_size)?;
641 Ok(self)
642 }
643
644 fn serialize_map(
645 mut self,
646 len: Option<usize>,
647 ) -> Result<Self::SerializeMap, Self::Error> {
648 let len = len.ok_or(Error::SequenceMustHaveLength)?;
649 let len_size = <usize as SchemaWrite<C>>::size_of(&len)?;
650 self.add_size(len_size)?;
651 Ok(self)
652 }
653
654 fn serialize_struct(
655 self,
656 _name: &'static str,
657 _len: usize,
658 ) -> Result<Self::SerializeStruct, Self::Error> {
659 Ok(self)
660 }
661
662 fn serialize_struct_variant(
663 mut self,
664 _name: &'static str,
665 variant_index: u32,
666 _variant: &'static str,
667 _len: usize,
668 ) -> Result<Self::SerializeStructVariant, Self::Error> {
669 let variant_index_size =
670 <u32 as SchemaWrite<C>>::size_of(&variant_index)?;
671 self.add_size(variant_index_size)?;
672 Ok(self)
673 }
674
675 #[cfg(not(feature = "alloc"))]
676 fn collect_str<T>(self, _: &T) -> Result<Self::Ok, Self::Error>
677 where
678 T: core::fmt::Display + ?Sized,
679 {
680 Err(Error::CannotCollectStr.into())
681 }
682
683 fn is_human_readable(&self) -> bool {
684 false
685 }
686}
687
688impl<C> serde::ser::SerializeSeq for SizeOf<C>
689where
690 C: wincode::config::Config,
691{
692 type Ok = Self;
693 type Error = SizeOfError;
694
695 fn serialize_element<T>(&mut self, value: &T) -> Result<(), Self::Error>
696 where
697 T: Serialize + ?Sized,
698 {
699 let serializer = SizeOf {
700 size: self.size,
701 marker: self.marker,
702 };
703 *self = value.serialize(serializer)?;
704 Ok(())
705 }
706
707 fn end(self) -> Result<Self::Ok, Self::Error> {
708 Ok(self)
709 }
710}
711
712impl<C> serde::ser::SerializeTuple for SizeOf<C>
713where
714 C: wincode::config::Config,
715{
716 type Ok = Self;
717 type Error = SizeOfError;
718
719 fn serialize_element<T>(&mut self, value: &T) -> Result<(), Self::Error>
720 where
721 T: Serialize + ?Sized,
722 {
723 let serializer = SizeOf {
724 size: self.size,
725 marker: self.marker,
726 };
727 *self = value.serialize(serializer)?;
728 Ok(())
729 }
730
731 fn end(self) -> Result<Self::Ok, Self::Error> {
732 Ok(self)
733 }
734}
735
736impl<C> serde::ser::SerializeTupleStruct for SizeOf<C>
737where
738 C: wincode::config::Config,
739{
740 type Ok = Self;
741 type Error = SizeOfError;
742
743 fn serialize_field<T>(&mut self, value: &T) -> Result<(), Self::Error>
744 where
745 T: Serialize + ?Sized,
746 {
747 let serializer = SizeOf {
748 size: self.size,
749 marker: self.marker,
750 };
751 *self = value.serialize(serializer)?;
752 Ok(())
753 }
754
755 fn end(self) -> Result<Self::Ok, Self::Error> {
756 Ok(self)
757 }
758}
759
760impl<C> serde::ser::SerializeTupleVariant for SizeOf<C>
761where
762 C: wincode::config::Config,
763{
764 type Ok = Self;
765 type Error = SizeOfError;
766
767 fn serialize_field<T>(&mut self, value: &T) -> Result<(), Self::Error>
768 where
769 T: Serialize + ?Sized,
770 {
771 let serializer = SizeOf {
772 size: self.size,
773 marker: self.marker,
774 };
775 *self = value.serialize(serializer)?;
776 Ok(())
777 }
778
779 fn end(self) -> Result<Self::Ok, Self::Error> {
780 Ok(self)
781 }
782}
783
784impl<C> serde::ser::SerializeMap for SizeOf<C>
785where
786 C: wincode::config::Config,
787{
788 type Ok = Self;
789 type Error = SizeOfError;
790
791 fn serialize_key<T>(&mut self, key: &T) -> Result<(), Self::Error>
792 where
793 T: Serialize + ?Sized,
794 {
795 let serializer = SizeOf {
796 size: self.size,
797 marker: self.marker,
798 };
799 *self = key.serialize(serializer)?;
800 Ok(())
801 }
802
803 fn serialize_value<T>(&mut self, value: &T) -> Result<(), Self::Error>
804 where
805 T: Serialize + ?Sized,
806 {
807 let serializer = SizeOf {
808 size: self.size,
809 marker: self.marker,
810 };
811 *self = value.serialize(serializer)?;
812 Ok(())
813 }
814
815 fn end(self) -> Result<Self::Ok, Self::Error> {
816 Ok(self)
817 }
818}
819
820impl<C> serde::ser::SerializeStruct for SizeOf<C>
821where
822 C: wincode::config::Config,
823{
824 type Ok = Self;
825 type Error = SizeOfError;
826
827 fn serialize_field<T>(
828 &mut self,
829 _key: &'static str,
830 value: &T,
831 ) -> Result<(), Self::Error>
832 where
833 T: Serialize + ?Sized,
834 {
835 let serializer = SizeOf {
836 size: self.size,
837 marker: self.marker,
838 };
839 *self = value.serialize(serializer)?;
840 Ok(())
841 }
842
843 fn end(self) -> Result<Self::Ok, Self::Error> {
844 Ok(self)
845 }
846}
847
848impl<C> serde::ser::SerializeStructVariant for SizeOf<C>
849where
850 C: wincode::config::Config,
851{
852 type Ok = Self;
853 type Error = SizeOfError;
854
855 fn serialize_field<T>(
856 &mut self,
857 _key: &'static str,
858 value: &T,
859 ) -> Result<(), Self::Error>
860 where
861 T: Serialize + ?Sized,
862 {
863 let serializer = SizeOf {
864 size: self.size,
865 marker: self.marker,
866 };
867 *self = value.serialize(serializer)?;
868 Ok(())
869 }
870
871 fn end(self) -> Result<Self::Ok, Self::Error> {
872 Ok(self)
873 }
874}