ipld_nostd/dag/
ser.rs

1//! Serialization.
2
3pub 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
15/// Serializes a value to a vector.
16pub 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
26/// A structure for serializing Rust values to DAG-CBOR.
27pub struct Serializer<W> {
28	writer: W,
29}
30
31impl<W> Serializer<W> {
32	/// Creates a new CBOR serializer.
33	pub fn new(writer: W) -> Serializer<W> {
34		Serializer { writer }
35	}
36
37	/// Returns the underlying writer.
38	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		// In DAG-CBOR floats are always encoded as f64.
111		self.serialize_f64(f64::from(v))
112	}
113
114	#[inline]
115	fn serialize_f64(self, v: f64) -> Result<Self::Ok, Self::Error> {
116		// In DAG-CBOR only finite floats are supported.
117		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		// The cbor4ii Serde implementation encodes unit as an empty array, for
162		// DAG-CBOR we encode it as `NULL`.
163		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
312/// Struct for implementign SerializeSeq.
313pub struct CollectSeq<'a, W> {
314	/// The number of elements. This is used in case the number of elements is
315	/// not known beforehand.
316	count: usize,
317	ser: &'a mut Serializer<W>,
318	/// An in-memory serializer in case the number of elements is not known
319	/// beforehand.
320	mem_ser: Option<Serializer<BufWriter>>,
321}
322
323impl<'a, W: enc::Write> CollectSeq<'a, W> {
324	/// If the length of the sequence is given, use it. Else buffer the sequence
325	/// in order to count the number of elements, which is then written before
326	/// the elements are.
327	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
345/// Helper for processing collections.
346pub 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		// Data was buffered in order to be able to write out the number of elements
372		// before they are serialized.
373		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
438/// CBOR RFC-7049 specifies a canonical sort order, where keys are sorted by
439/// length first. This was later revised with RFC-8949, but we need to stick to
440/// the original order to stay compatible with existing data.
441/// We first serialize each map entry (the key and the value) into a buffer and
442/// then sort those buffers. Once sorted they are written to the actual output.
443pub 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		// Instantiate a new serializer, so that the buffer can be re-used.
467		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		// This sorting step makes sure we have the expected order of the keys.
485		// Byte-wise comparison over the encoded forms gives us the right order as
486		// keys in DAG-CBOR are always (text) strings, hence have the same CBOR
487		// major type 3. The length of the string is encoded in the prefix bits
488		// along with the major type. This means that a shorter string
489		// always sorts before a longer string even with the compact length
490		// representation.
491		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		// The key needs to be add to the buffer without any further operations.
512		// Serializing the value will then do the necessary flushing etc.
513		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
579/// Serializing a CID correctly as DAG-CBOR.
580struct 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		// The bytes of the CID is prefixed with a null byte when encoded as CBOR.
650		let prefixed = [&[0x00], value].concat();
651		// CIDs are serialized with CBOR tag 42.
652		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}