1use crate::lib::*;
2
3use crate::ser::{self, Impossible, Serialize, SerializeMap, SerializeStruct, Serializer};
4
5#[cfg(any(feature = "std", feature = "alloc"))]
6use self::content::{
7 Content, ContentSerializer, SerializeStructVariantAsMapValue, SerializeTupleVariantAsMapValue,
8};
9
10pub fn constrain<T: ?Sized>(t: &T) -> &T {
13 t
14}
15
16pub fn serialize_tagged_newtype<S, T>(
18 serializer: S,
19 type_ident: &'static str,
20 variant_ident: &'static str,
21 tag: &'static str,
22 variant_name: &'static str,
23 value: &T,
24) -> Result<S::Ok, S::Error>
25where
26 S: Serializer,
27 T: Serialize,
28{
29 value.serialize(TaggedSerializer {
30 type_ident,
31 variant_ident,
32 tag,
33 variant_name,
34 delegate: serializer,
35 })
36}
37
38struct TaggedSerializer<S> {
39 type_ident: &'static str,
40 variant_ident: &'static str,
41 tag: &'static str,
42 variant_name: &'static str,
43 delegate: S,
44}
45
46enum Unsupported {
47 Boolean,
48 Integer,
49 Float,
50 Char,
51 String,
52 ByteArray,
53 Optional,
54 Sequence,
55 Tuple,
56 TupleStruct,
57 #[cfg(not(any(feature = "std", feature = "alloc")))]
58 Enum,
59}
60
61impl Display for Unsupported {
62 fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
63 match *self {
64 Unsupported::Boolean => formatter.write_str("a boolean"),
65 Unsupported::Integer => formatter.write_str("an integer"),
66 Unsupported::Float => formatter.write_str("a float"),
67 Unsupported::Char => formatter.write_str("a char"),
68 Unsupported::String => formatter.write_str("a string"),
69 Unsupported::ByteArray => formatter.write_str("a byte array"),
70 Unsupported::Optional => formatter.write_str("an optional"),
71 Unsupported::Sequence => formatter.write_str("a sequence"),
72 Unsupported::Tuple => formatter.write_str("a tuple"),
73 Unsupported::TupleStruct => formatter.write_str("a tuple struct"),
74 #[cfg(not(any(feature = "std", feature = "alloc")))]
75 Unsupported::Enum => formatter.write_str("an enum"),
76 }
77 }
78}
79
80impl<S> TaggedSerializer<S>
81where
82 S: Serializer,
83{
84 fn bad_type(self, what: Unsupported) -> S::Error {
85 ser::Error::custom(format_args!(
86 "cannot serialize tagged newtype variant {}::{} containing {}",
87 self.type_ident, self.variant_ident, what
88 ))
89 }
90}
91
92impl<S> Serializer for TaggedSerializer<S>
93where
94 S: Serializer,
95{
96 type Ok = S::Ok;
97 type Error = S::Error;
98
99 type SerializeSeq = Impossible<S::Ok, S::Error>;
100 type SerializeTuple = Impossible<S::Ok, S::Error>;
101 type SerializeTupleStruct = Impossible<S::Ok, S::Error>;
102 type SerializeMap = S::SerializeMap;
103 type SerializeStruct = S::SerializeStruct;
104
105 #[cfg(not(any(feature = "std", feature = "alloc")))]
106 type SerializeTupleVariant = Impossible<S::Ok, S::Error>;
107 #[cfg(any(feature = "std", feature = "alloc"))]
108 type SerializeTupleVariant = SerializeTupleVariantAsMapValue<S::SerializeMap>;
109
110 #[cfg(not(any(feature = "std", feature = "alloc")))]
111 type SerializeStructVariant = Impossible<S::Ok, S::Error>;
112 #[cfg(any(feature = "std", feature = "alloc"))]
113 type SerializeStructVariant = SerializeStructVariantAsMapValue<S::SerializeMap>;
114
115 fn serialize_bool(self, _: bool) -> Result<Self::Ok, Self::Error> {
116 Err(self.bad_type(Unsupported::Boolean))
117 }
118
119 fn serialize_i8(self, _: i8) -> Result<Self::Ok, Self::Error> {
120 Err(self.bad_type(Unsupported::Integer))
121 }
122
123 fn serialize_i16(self, _: i16) -> Result<Self::Ok, Self::Error> {
124 Err(self.bad_type(Unsupported::Integer))
125 }
126
127 fn serialize_i32(self, _: i32) -> Result<Self::Ok, Self::Error> {
128 Err(self.bad_type(Unsupported::Integer))
129 }
130
131 fn serialize_i64(self, _: i64) -> Result<Self::Ok, Self::Error> {
132 Err(self.bad_type(Unsupported::Integer))
133 }
134
135 fn serialize_u8(self, _: u8) -> Result<Self::Ok, Self::Error> {
136 Err(self.bad_type(Unsupported::Integer))
137 }
138
139 fn serialize_u16(self, _: u16) -> Result<Self::Ok, Self::Error> {
140 Err(self.bad_type(Unsupported::Integer))
141 }
142
143 fn serialize_u32(self, _: u32) -> Result<Self::Ok, Self::Error> {
144 Err(self.bad_type(Unsupported::Integer))
145 }
146
147 fn serialize_u64(self, _: u64) -> Result<Self::Ok, Self::Error> {
148 Err(self.bad_type(Unsupported::Integer))
149 }
150
151 fn serialize_f32(self, _: f32) -> Result<Self::Ok, Self::Error> {
152 Err(self.bad_type(Unsupported::Float))
153 }
154
155 fn serialize_f64(self, _: f64) -> Result<Self::Ok, Self::Error> {
156 Err(self.bad_type(Unsupported::Float))
157 }
158
159 fn serialize_char(self, _: char) -> Result<Self::Ok, Self::Error> {
160 Err(self.bad_type(Unsupported::Char))
161 }
162
163 fn serialize_str(self, _: &str) -> Result<Self::Ok, Self::Error> {
164 Err(self.bad_type(Unsupported::String))
165 }
166
167 fn serialize_bytes(self, _: &[u8]) -> Result<Self::Ok, Self::Error> {
168 Err(self.bad_type(Unsupported::ByteArray))
169 }
170
171 fn serialize_none(self) -> Result<Self::Ok, Self::Error> {
172 Err(self.bad_type(Unsupported::Optional))
173 }
174
175 fn serialize_some<T>(self, _: &T) -> Result<Self::Ok, Self::Error>
176 where
177 T: ?Sized + Serialize,
178 {
179 Err(self.bad_type(Unsupported::Optional))
180 }
181
182 fn serialize_unit(self) -> Result<Self::Ok, Self::Error> {
183 let mut map = tri!(self.delegate.serialize_map(Some(1)));
184 tri!(map.serialize_entry(self.tag, self.variant_name));
185 map.end()
186 }
187
188 fn serialize_unit_struct(self, _: &'static str) -> Result<Self::Ok, Self::Error> {
189 let mut map = tri!(self.delegate.serialize_map(Some(1)));
190 tri!(map.serialize_entry(self.tag, self.variant_name));
191 map.end()
192 }
193
194 fn serialize_unit_variant(
195 self,
196 _: &'static str,
197 _: u32,
198 inner_variant: &'static str,
199 ) -> Result<Self::Ok, Self::Error> {
200 let mut map = tri!(self.delegate.serialize_map(Some(2)));
201 tri!(map.serialize_entry(self.tag, self.variant_name));
202 tri!(map.serialize_entry(inner_variant, &()));
203 map.end()
204 }
205
206 fn serialize_newtype_struct<T>(
207 self,
208 _: &'static str,
209 value: &T,
210 ) -> Result<Self::Ok, Self::Error>
211 where
212 T: ?Sized + Serialize,
213 {
214 value.serialize(self)
215 }
216
217 fn serialize_newtype_variant<T>(
218 self,
219 _: &'static str,
220 _: u32,
221 inner_variant: &'static str,
222 inner_value: &T,
223 ) -> Result<Self::Ok, Self::Error>
224 where
225 T: ?Sized + Serialize,
226 {
227 let mut map = tri!(self.delegate.serialize_map(Some(2)));
228 tri!(map.serialize_entry(self.tag, self.variant_name));
229 tri!(map.serialize_entry(inner_variant, inner_value));
230 map.end()
231 }
232
233 fn serialize_seq(self, _: Option<usize>) -> Result<Self::SerializeSeq, Self::Error> {
234 Err(self.bad_type(Unsupported::Sequence))
235 }
236
237 fn serialize_tuple(self, _: usize) -> Result<Self::SerializeTuple, Self::Error> {
238 Err(self.bad_type(Unsupported::Tuple))
239 }
240
241 fn serialize_tuple_struct(
242 self,
243 _: &'static str,
244 _: usize,
245 ) -> Result<Self::SerializeTupleStruct, Self::Error> {
246 Err(self.bad_type(Unsupported::TupleStruct))
247 }
248
249 #[cfg(not(any(feature = "std", feature = "alloc")))]
250 fn serialize_tuple_variant(
251 self,
252 _: &'static str,
253 _: u32,
254 _: &'static str,
255 _: usize,
256 ) -> Result<Self::SerializeTupleVariant, Self::Error> {
257 Err(self.bad_type(Unsupported::Enum))
260 }
261
262 #[cfg(any(feature = "std", feature = "alloc"))]
263 fn serialize_tuple_variant(
264 self,
265 _: &'static str,
266 _: u32,
267 inner_variant: &'static str,
268 len: usize,
269 ) -> Result<Self::SerializeTupleVariant, Self::Error> {
270 let mut map = tri!(self.delegate.serialize_map(Some(2)));
271 tri!(map.serialize_entry(self.tag, self.variant_name));
272 tri!(map.serialize_key(inner_variant));
273 Ok(SerializeTupleVariantAsMapValue::new(
274 map,
275 inner_variant,
276 len,
277 ))
278 }
279
280 fn serialize_map(self, len: Option<usize>) -> Result<Self::SerializeMap, Self::Error> {
281 let mut map = tri!(self.delegate.serialize_map(len.map(|len| len + 1)));
282 tri!(map.serialize_entry(self.tag, self.variant_name));
283 Ok(map)
284 }
285
286 fn serialize_struct(
287 self,
288 name: &'static str,
289 len: usize,
290 ) -> Result<Self::SerializeStruct, Self::Error> {
291 let mut state = tri!(self.delegate.serialize_struct(name, len + 1));
292 tri!(state.serialize_field(self.tag, self.variant_name));
293 Ok(state)
294 }
295
296 #[cfg(not(any(feature = "std", feature = "alloc")))]
297 fn serialize_struct_variant(
298 self,
299 _: &'static str,
300 _: u32,
301 _: &'static str,
302 _: usize,
303 ) -> Result<Self::SerializeStructVariant, Self::Error> {
304 Err(self.bad_type(Unsupported::Enum))
307 }
308
309 #[cfg(any(feature = "std", feature = "alloc"))]
310 fn serialize_struct_variant(
311 self,
312 _: &'static str,
313 _: u32,
314 inner_variant: &'static str,
315 len: usize,
316 ) -> Result<Self::SerializeStructVariant, Self::Error> {
317 let mut map = tri!(self.delegate.serialize_map(Some(2)));
318 tri!(map.serialize_entry(self.tag, self.variant_name));
319 tri!(map.serialize_key(inner_variant));
320 Ok(SerializeStructVariantAsMapValue::new(
321 map,
322 inner_variant,
323 len,
324 ))
325 }
326
327 #[cfg(not(any(feature = "std", feature = "alloc")))]
328 fn collect_str<T>(self, _: &T) -> Result<Self::Ok, Self::Error>
329 where
330 T: ?Sized + Display,
331 {
332 Err(self.bad_type(Unsupported::String))
333 }
334}
335
336#[cfg(any(feature = "std", feature = "alloc"))]
337mod content {
338 use crate::lib::*;
339
340 use crate::ser::{self, Serialize, Serializer};
341
342 pub struct SerializeTupleVariantAsMapValue<M> {
343 map: M,
344 name: &'static str,
345 fields: Vec<Content>,
346 }
347
348 impl<M> SerializeTupleVariantAsMapValue<M> {
349 pub fn new(map: M, name: &'static str, len: usize) -> Self {
350 SerializeTupleVariantAsMapValue {
351 map,
352 name,
353 fields: Vec::with_capacity(len),
354 }
355 }
356 }
357
358 impl<M> ser::SerializeTupleVariant for SerializeTupleVariantAsMapValue<M>
359 where
360 M: ser::SerializeMap,
361 {
362 type Ok = M::Ok;
363 type Error = M::Error;
364
365 fn serialize_field<T>(&mut self, value: &T) -> Result<(), M::Error>
366 where
367 T: ?Sized + Serialize,
368 {
369 let value = tri!(value.serialize(ContentSerializer::<M::Error>::new()));
370 self.fields.push(value);
371 Ok(())
372 }
373
374 fn end(mut self) -> Result<M::Ok, M::Error> {
375 tri!(self
376 .map
377 .serialize_value(&Content::TupleStruct(self.name, self.fields)));
378 self.map.end()
379 }
380 }
381
382 pub struct SerializeStructVariantAsMapValue<M> {
383 map: M,
384 name: &'static str,
385 fields: Vec<(&'static str, Content)>,
386 }
387
388 impl<M> SerializeStructVariantAsMapValue<M> {
389 pub fn new(map: M, name: &'static str, len: usize) -> Self {
390 SerializeStructVariantAsMapValue {
391 map,
392 name,
393 fields: Vec::with_capacity(len),
394 }
395 }
396 }
397
398 impl<M> ser::SerializeStructVariant for SerializeStructVariantAsMapValue<M>
399 where
400 M: ser::SerializeMap,
401 {
402 type Ok = M::Ok;
403 type Error = M::Error;
404
405 fn serialize_field<T>(&mut self, key: &'static str, value: &T) -> Result<(), M::Error>
406 where
407 T: ?Sized + Serialize,
408 {
409 let value = tri!(value.serialize(ContentSerializer::<M::Error>::new()));
410 self.fields.push((key, value));
411 Ok(())
412 }
413
414 fn end(mut self) -> Result<M::Ok, M::Error> {
415 tri!(self
416 .map
417 .serialize_value(&Content::Struct(self.name, self.fields)));
418 self.map.end()
419 }
420 }
421
422 pub enum Content {
423 Bool(bool),
424
425 U8(u8),
426 U16(u16),
427 U32(u32),
428 U64(u64),
429
430 I8(i8),
431 I16(i16),
432 I32(i32),
433 I64(i64),
434
435 F32(f32),
436 F64(f64),
437
438 Char(char),
439 String(String),
440 Bytes(Vec<u8>),
441
442 None,
443 Some(Box<Content>),
444
445 Unit,
446 UnitStruct(&'static str),
447 UnitVariant(&'static str, u32, &'static str),
448 NewtypeStruct(&'static str, Box<Content>),
449 NewtypeVariant(&'static str, u32, &'static str, Box<Content>),
450
451 Seq(Vec<Content>),
452 Tuple(Vec<Content>),
453 TupleStruct(&'static str, Vec<Content>),
454 TupleVariant(&'static str, u32, &'static str, Vec<Content>),
455 Map(Vec<(Content, Content)>),
456 Struct(&'static str, Vec<(&'static str, Content)>),
457 StructVariant(
458 &'static str,
459 u32,
460 &'static str,
461 Vec<(&'static str, Content)>,
462 ),
463 }
464
465 impl Serialize for Content {
466 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
467 where
468 S: Serializer,
469 {
470 match *self {
471 Content::Bool(b) => serializer.serialize_bool(b),
472 Content::U8(u) => serializer.serialize_u8(u),
473 Content::U16(u) => serializer.serialize_u16(u),
474 Content::U32(u) => serializer.serialize_u32(u),
475 Content::U64(u) => serializer.serialize_u64(u),
476 Content::I8(i) => serializer.serialize_i8(i),
477 Content::I16(i) => serializer.serialize_i16(i),
478 Content::I32(i) => serializer.serialize_i32(i),
479 Content::I64(i) => serializer.serialize_i64(i),
480 Content::F32(f) => serializer.serialize_f32(f),
481 Content::F64(f) => serializer.serialize_f64(f),
482 Content::Char(c) => serializer.serialize_char(c),
483 Content::String(ref s) => serializer.serialize_str(s),
484 Content::Bytes(ref b) => serializer.serialize_bytes(b),
485 Content::None => serializer.serialize_none(),
486 Content::Some(ref c) => serializer.serialize_some(&**c),
487 Content::Unit => serializer.serialize_unit(),
488 Content::UnitStruct(n) => serializer.serialize_unit_struct(n),
489 Content::UnitVariant(n, i, v) => serializer.serialize_unit_variant(n, i, v),
490 Content::NewtypeStruct(n, ref c) => serializer.serialize_newtype_struct(n, &**c),
491 Content::NewtypeVariant(n, i, v, ref c) => {
492 serializer.serialize_newtype_variant(n, i, v, &**c)
493 }
494 Content::Seq(ref elements) => elements.serialize(serializer),
495 Content::Tuple(ref elements) => {
496 use crate::ser::SerializeTuple;
497 let mut tuple = tri!(serializer.serialize_tuple(elements.len()));
498 for e in elements {
499 tri!(tuple.serialize_element(e));
500 }
501 tuple.end()
502 }
503 Content::TupleStruct(n, ref fields) => {
504 use crate::ser::SerializeTupleStruct;
505 let mut ts = tri!(serializer.serialize_tuple_struct(n, fields.len()));
506 for f in fields {
507 tri!(ts.serialize_field(f));
508 }
509 ts.end()
510 }
511 Content::TupleVariant(n, i, v, ref fields) => {
512 use crate::ser::SerializeTupleVariant;
513 let mut tv = tri!(serializer.serialize_tuple_variant(n, i, v, fields.len()));
514 for f in fields {
515 tri!(tv.serialize_field(f));
516 }
517 tv.end()
518 }
519 Content::Map(ref entries) => {
520 use crate::ser::SerializeMap;
521 let mut map = tri!(serializer.serialize_map(Some(entries.len())));
522 for (k, v) in entries {
523 tri!(map.serialize_entry(k, v));
524 }
525 map.end()
526 }
527 Content::Struct(n, ref fields) => {
528 use crate::ser::SerializeStruct;
529 let mut s = tri!(serializer.serialize_struct(n, fields.len()));
530 for &(k, ref v) in fields {
531 tri!(s.serialize_field(k, v));
532 }
533 s.end()
534 }
535 Content::StructVariant(n, i, v, ref fields) => {
536 use crate::ser::SerializeStructVariant;
537 let mut sv = tri!(serializer.serialize_struct_variant(n, i, v, fields.len()));
538 for &(k, ref v) in fields {
539 tri!(sv.serialize_field(k, v));
540 }
541 sv.end()
542 }
543 }
544 }
545 }
546
547 pub struct ContentSerializer<E> {
548 error: PhantomData<E>,
549 }
550
551 impl<E> ContentSerializer<E> {
552 pub fn new() -> Self {
553 ContentSerializer { error: PhantomData }
554 }
555 }
556
557 impl<E> Serializer for ContentSerializer<E>
558 where
559 E: ser::Error,
560 {
561 type Ok = Content;
562 type Error = E;
563
564 type SerializeSeq = SerializeSeq<E>;
565 type SerializeTuple = SerializeTuple<E>;
566 type SerializeTupleStruct = SerializeTupleStruct<E>;
567 type SerializeTupleVariant = SerializeTupleVariant<E>;
568 type SerializeMap = SerializeMap<E>;
569 type SerializeStruct = SerializeStruct<E>;
570 type SerializeStructVariant = SerializeStructVariant<E>;
571
572 fn serialize_bool(self, v: bool) -> Result<Content, E> {
573 Ok(Content::Bool(v))
574 }
575
576 fn serialize_i8(self, v: i8) -> Result<Content, E> {
577 Ok(Content::I8(v))
578 }
579
580 fn serialize_i16(self, v: i16) -> Result<Content, E> {
581 Ok(Content::I16(v))
582 }
583
584 fn serialize_i32(self, v: i32) -> Result<Content, E> {
585 Ok(Content::I32(v))
586 }
587
588 fn serialize_i64(self, v: i64) -> Result<Content, E> {
589 Ok(Content::I64(v))
590 }
591
592 fn serialize_u8(self, v: u8) -> Result<Content, E> {
593 Ok(Content::U8(v))
594 }
595
596 fn serialize_u16(self, v: u16) -> Result<Content, E> {
597 Ok(Content::U16(v))
598 }
599
600 fn serialize_u32(self, v: u32) -> Result<Content, E> {
601 Ok(Content::U32(v))
602 }
603
604 fn serialize_u64(self, v: u64) -> Result<Content, E> {
605 Ok(Content::U64(v))
606 }
607
608 fn serialize_f32(self, v: f32) -> Result<Content, E> {
609 Ok(Content::F32(v))
610 }
611
612 fn serialize_f64(self, v: f64) -> Result<Content, E> {
613 Ok(Content::F64(v))
614 }
615
616 fn serialize_char(self, v: char) -> Result<Content, E> {
617 Ok(Content::Char(v))
618 }
619
620 fn serialize_str(self, value: &str) -> Result<Content, E> {
621 Ok(Content::String(value.to_owned()))
622 }
623
624 fn serialize_bytes(self, value: &[u8]) -> Result<Content, E> {
625 Ok(Content::Bytes(value.to_owned()))
626 }
627
628 fn serialize_none(self) -> Result<Content, E> {
629 Ok(Content::None)
630 }
631
632 fn serialize_some<T>(self, value: &T) -> Result<Content, E>
633 where
634 T: ?Sized + Serialize,
635 {
636 Ok(Content::Some(Box::new(tri!(value.serialize(self)))))
637 }
638
639 fn serialize_unit(self) -> Result<Content, E> {
640 Ok(Content::Unit)
641 }
642
643 fn serialize_unit_struct(self, name: &'static str) -> Result<Content, E> {
644 Ok(Content::UnitStruct(name))
645 }
646
647 fn serialize_unit_variant(
648 self,
649 name: &'static str,
650 variant_index: u32,
651 variant: &'static str,
652 ) -> Result<Content, E> {
653 Ok(Content::UnitVariant(name, variant_index, variant))
654 }
655
656 fn serialize_newtype_struct<T>(self, name: &'static str, value: &T) -> Result<Content, E>
657 where
658 T: ?Sized + Serialize,
659 {
660 Ok(Content::NewtypeStruct(
661 name,
662 Box::new(tri!(value.serialize(self))),
663 ))
664 }
665
666 fn serialize_newtype_variant<T>(
667 self,
668 name: &'static str,
669 variant_index: u32,
670 variant: &'static str,
671 value: &T,
672 ) -> Result<Content, E>
673 where
674 T: ?Sized + Serialize,
675 {
676 Ok(Content::NewtypeVariant(
677 name,
678 variant_index,
679 variant,
680 Box::new(tri!(value.serialize(self))),
681 ))
682 }
683
684 fn serialize_seq(self, len: Option<usize>) -> Result<Self::SerializeSeq, E> {
685 Ok(SerializeSeq {
686 elements: Vec::with_capacity(len.unwrap_or(0)),
687 error: PhantomData,
688 })
689 }
690
691 fn serialize_tuple(self, len: usize) -> Result<Self::SerializeTuple, E> {
692 Ok(SerializeTuple {
693 elements: Vec::with_capacity(len),
694 error: PhantomData,
695 })
696 }
697
698 fn serialize_tuple_struct(
699 self,
700 name: &'static str,
701 len: usize,
702 ) -> Result<Self::SerializeTupleStruct, E> {
703 Ok(SerializeTupleStruct {
704 name,
705 fields: Vec::with_capacity(len),
706 error: PhantomData,
707 })
708 }
709
710 fn serialize_tuple_variant(
711 self,
712 name: &'static str,
713 variant_index: u32,
714 variant: &'static str,
715 len: usize,
716 ) -> Result<Self::SerializeTupleVariant, E> {
717 Ok(SerializeTupleVariant {
718 name,
719 variant_index,
720 variant,
721 fields: Vec::with_capacity(len),
722 error: PhantomData,
723 })
724 }
725
726 fn serialize_map(self, len: Option<usize>) -> Result<Self::SerializeMap, E> {
727 Ok(SerializeMap {
728 entries: Vec::with_capacity(len.unwrap_or(0)),
729 key: None,
730 error: PhantomData,
731 })
732 }
733
734 fn serialize_struct(
735 self,
736 name: &'static str,
737 len: usize,
738 ) -> Result<Self::SerializeStruct, E> {
739 Ok(SerializeStruct {
740 name,
741 fields: Vec::with_capacity(len),
742 error: PhantomData,
743 })
744 }
745
746 fn serialize_struct_variant(
747 self,
748 name: &'static str,
749 variant_index: u32,
750 variant: &'static str,
751 len: usize,
752 ) -> Result<Self::SerializeStructVariant, E> {
753 Ok(SerializeStructVariant {
754 name,
755 variant_index,
756 variant,
757 fields: Vec::with_capacity(len),
758 error: PhantomData,
759 })
760 }
761 }
762
763 pub struct SerializeSeq<E> {
764 elements: Vec<Content>,
765 error: PhantomData<E>,
766 }
767
768 impl<E> ser::SerializeSeq for SerializeSeq<E>
769 where
770 E: ser::Error,
771 {
772 type Ok = Content;
773 type Error = E;
774
775 fn serialize_element<T>(&mut self, value: &T) -> Result<(), E>
776 where
777 T: ?Sized + Serialize,
778 {
779 let value = tri!(value.serialize(ContentSerializer::<E>::new()));
780 self.elements.push(value);
781 Ok(())
782 }
783
784 fn end(self) -> Result<Content, E> {
785 Ok(Content::Seq(self.elements))
786 }
787 }
788
789 pub struct SerializeTuple<E> {
790 elements: Vec<Content>,
791 error: PhantomData<E>,
792 }
793
794 impl<E> ser::SerializeTuple for SerializeTuple<E>
795 where
796 E: ser::Error,
797 {
798 type Ok = Content;
799 type Error = E;
800
801 fn serialize_element<T>(&mut self, value: &T) -> Result<(), E>
802 where
803 T: ?Sized + Serialize,
804 {
805 let value = tri!(value.serialize(ContentSerializer::<E>::new()));
806 self.elements.push(value);
807 Ok(())
808 }
809
810 fn end(self) -> Result<Content, E> {
811 Ok(Content::Tuple(self.elements))
812 }
813 }
814
815 pub struct SerializeTupleStruct<E> {
816 name: &'static str,
817 fields: Vec<Content>,
818 error: PhantomData<E>,
819 }
820
821 impl<E> ser::SerializeTupleStruct for SerializeTupleStruct<E>
822 where
823 E: ser::Error,
824 {
825 type Ok = Content;
826 type Error = E;
827
828 fn serialize_field<T>(&mut self, value: &T) -> Result<(), E>
829 where
830 T: ?Sized + Serialize,
831 {
832 let value = tri!(value.serialize(ContentSerializer::<E>::new()));
833 self.fields.push(value);
834 Ok(())
835 }
836
837 fn end(self) -> Result<Content, E> {
838 Ok(Content::TupleStruct(self.name, self.fields))
839 }
840 }
841
842 pub struct SerializeTupleVariant<E> {
843 name: &'static str,
844 variant_index: u32,
845 variant: &'static str,
846 fields: Vec<Content>,
847 error: PhantomData<E>,
848 }
849
850 impl<E> ser::SerializeTupleVariant for SerializeTupleVariant<E>
851 where
852 E: ser::Error,
853 {
854 type Ok = Content;
855 type Error = E;
856
857 fn serialize_field<T>(&mut self, value: &T) -> Result<(), E>
858 where
859 T: ?Sized + Serialize,
860 {
861 let value = tri!(value.serialize(ContentSerializer::<E>::new()));
862 self.fields.push(value);
863 Ok(())
864 }
865
866 fn end(self) -> Result<Content, E> {
867 Ok(Content::TupleVariant(
868 self.name,
869 self.variant_index,
870 self.variant,
871 self.fields,
872 ))
873 }
874 }
875
876 pub struct SerializeMap<E> {
877 entries: Vec<(Content, Content)>,
878 key: Option<Content>,
879 error: PhantomData<E>,
880 }
881
882 impl<E> ser::SerializeMap for SerializeMap<E>
883 where
884 E: ser::Error,
885 {
886 type Ok = Content;
887 type Error = E;
888
889 fn serialize_key<T>(&mut self, key: &T) -> Result<(), E>
890 where
891 T: ?Sized + Serialize,
892 {
893 let key = tri!(key.serialize(ContentSerializer::<E>::new()));
894 self.key = Some(key);
895 Ok(())
896 }
897
898 fn serialize_value<T>(&mut self, value: &T) -> Result<(), E>
899 where
900 T: ?Sized + Serialize,
901 {
902 let key = self
903 .key
904 .take()
905 .expect("serialize_value called before serialize_key");
906 let value = tri!(value.serialize(ContentSerializer::<E>::new()));
907 self.entries.push((key, value));
908 Ok(())
909 }
910
911 fn end(self) -> Result<Content, E> {
912 Ok(Content::Map(self.entries))
913 }
914
915 fn serialize_entry<K, V>(&mut self, key: &K, value: &V) -> Result<(), E>
916 where
917 K: ?Sized + Serialize,
918 V: ?Sized + Serialize,
919 {
920 let key = tri!(key.serialize(ContentSerializer::<E>::new()));
921 let value = tri!(value.serialize(ContentSerializer::<E>::new()));
922 self.entries.push((key, value));
923 Ok(())
924 }
925 }
926
927 pub struct SerializeStruct<E> {
928 name: &'static str,
929 fields: Vec<(&'static str, Content)>,
930 error: PhantomData<E>,
931 }
932
933 impl<E> ser::SerializeStruct for SerializeStruct<E>
934 where
935 E: ser::Error,
936 {
937 type Ok = Content;
938 type Error = E;
939
940 fn serialize_field<T>(&mut self, key: &'static str, value: &T) -> Result<(), E>
941 where
942 T: ?Sized + Serialize,
943 {
944 let value = tri!(value.serialize(ContentSerializer::<E>::new()));
945 self.fields.push((key, value));
946 Ok(())
947 }
948
949 fn end(self) -> Result<Content, E> {
950 Ok(Content::Struct(self.name, self.fields))
951 }
952 }
953
954 pub struct SerializeStructVariant<E> {
955 name: &'static str,
956 variant_index: u32,
957 variant: &'static str,
958 fields: Vec<(&'static str, Content)>,
959 error: PhantomData<E>,
960 }
961
962 impl<E> ser::SerializeStructVariant for SerializeStructVariant<E>
963 where
964 E: ser::Error,
965 {
966 type Ok = Content;
967 type Error = E;
968
969 fn serialize_field<T>(&mut self, key: &'static str, value: &T) -> Result<(), E>
970 where
971 T: ?Sized + Serialize,
972 {
973 let value = tri!(value.serialize(ContentSerializer::<E>::new()));
974 self.fields.push((key, value));
975 Ok(())
976 }
977
978 fn end(self) -> Result<Content, E> {
979 Ok(Content::StructVariant(
980 self.name,
981 self.variant_index,
982 self.variant,
983 self.fields,
984 ))
985 }
986 }
987}
988
989#[cfg(any(feature = "std", feature = "alloc"))]
990pub struct FlatMapSerializer<'a, M: 'a>(pub &'a mut M);
991
992#[cfg(any(feature = "std", feature = "alloc"))]
993impl<'a, M> FlatMapSerializer<'a, M>
994where
995 M: SerializeMap + 'a,
996{
997 fn bad_type(what: Unsupported) -> M::Error {
998 ser::Error::custom(format_args!(
999 "can only flatten structs and maps (got {})",
1000 what
1001 ))
1002 }
1003}
1004
1005#[cfg(any(feature = "std", feature = "alloc"))]
1006impl<'a, M> Serializer for FlatMapSerializer<'a, M>
1007where
1008 M: SerializeMap + 'a,
1009{
1010 type Ok = ();
1011 type Error = M::Error;
1012
1013 type SerializeSeq = Impossible<Self::Ok, M::Error>;
1014 type SerializeTuple = Impossible<Self::Ok, M::Error>;
1015 type SerializeTupleStruct = Impossible<Self::Ok, M::Error>;
1016 type SerializeMap = FlatMapSerializeMap<'a, M>;
1017 type SerializeStruct = FlatMapSerializeStruct<'a, M>;
1018 type SerializeTupleVariant = FlatMapSerializeTupleVariantAsMapValue<'a, M>;
1019 type SerializeStructVariant = FlatMapSerializeStructVariantAsMapValue<'a, M>;
1020
1021 fn serialize_bool(self, _: bool) -> Result<Self::Ok, Self::Error> {
1022 Err(Self::bad_type(Unsupported::Boolean))
1023 }
1024
1025 fn serialize_i8(self, _: i8) -> Result<Self::Ok, Self::Error> {
1026 Err(Self::bad_type(Unsupported::Integer))
1027 }
1028
1029 fn serialize_i16(self, _: i16) -> Result<Self::Ok, Self::Error> {
1030 Err(Self::bad_type(Unsupported::Integer))
1031 }
1032
1033 fn serialize_i32(self, _: i32) -> Result<Self::Ok, Self::Error> {
1034 Err(Self::bad_type(Unsupported::Integer))
1035 }
1036
1037 fn serialize_i64(self, _: i64) -> Result<Self::Ok, Self::Error> {
1038 Err(Self::bad_type(Unsupported::Integer))
1039 }
1040
1041 fn serialize_u8(self, _: u8) -> Result<Self::Ok, Self::Error> {
1042 Err(Self::bad_type(Unsupported::Integer))
1043 }
1044
1045 fn serialize_u16(self, _: u16) -> Result<Self::Ok, Self::Error> {
1046 Err(Self::bad_type(Unsupported::Integer))
1047 }
1048
1049 fn serialize_u32(self, _: u32) -> Result<Self::Ok, Self::Error> {
1050 Err(Self::bad_type(Unsupported::Integer))
1051 }
1052
1053 fn serialize_u64(self, _: u64) -> Result<Self::Ok, Self::Error> {
1054 Err(Self::bad_type(Unsupported::Integer))
1055 }
1056
1057 fn serialize_f32(self, _: f32) -> Result<Self::Ok, Self::Error> {
1058 Err(Self::bad_type(Unsupported::Float))
1059 }
1060
1061 fn serialize_f64(self, _: f64) -> Result<Self::Ok, Self::Error> {
1062 Err(Self::bad_type(Unsupported::Float))
1063 }
1064
1065 fn serialize_char(self, _: char) -> Result<Self::Ok, Self::Error> {
1066 Err(Self::bad_type(Unsupported::Char))
1067 }
1068
1069 fn serialize_str(self, _: &str) -> Result<Self::Ok, Self::Error> {
1070 Err(Self::bad_type(Unsupported::String))
1071 }
1072
1073 fn serialize_bytes(self, _: &[u8]) -> Result<Self::Ok, Self::Error> {
1074 Err(Self::bad_type(Unsupported::ByteArray))
1075 }
1076
1077 fn serialize_none(self) -> Result<Self::Ok, Self::Error> {
1078 Ok(())
1079 }
1080
1081 fn serialize_some<T>(self, value: &T) -> Result<Self::Ok, Self::Error>
1082 where
1083 T: ?Sized + Serialize,
1084 {
1085 value.serialize(self)
1086 }
1087
1088 fn serialize_unit(self) -> Result<Self::Ok, Self::Error> {
1089 Ok(())
1090 }
1091
1092 fn serialize_unit_struct(self, _: &'static str) -> Result<Self::Ok, Self::Error> {
1093 Ok(())
1094 }
1095
1096 fn serialize_unit_variant(
1097 self,
1098 _: &'static str,
1099 _: u32,
1100 variant: &'static str,
1101 ) -> Result<Self::Ok, Self::Error> {
1102 self.0.serialize_entry(variant, &())
1103 }
1104
1105 fn serialize_newtype_struct<T>(
1106 self,
1107 _: &'static str,
1108 value: &T,
1109 ) -> Result<Self::Ok, Self::Error>
1110 where
1111 T: ?Sized + Serialize,
1112 {
1113 value.serialize(self)
1114 }
1115
1116 fn serialize_newtype_variant<T>(
1117 self,
1118 _: &'static str,
1119 _: u32,
1120 variant: &'static str,
1121 value: &T,
1122 ) -> Result<Self::Ok, Self::Error>
1123 where
1124 T: ?Sized + Serialize,
1125 {
1126 self.0.serialize_entry(variant, value)
1127 }
1128
1129 fn serialize_seq(self, _: Option<usize>) -> Result<Self::SerializeSeq, Self::Error> {
1130 Err(Self::bad_type(Unsupported::Sequence))
1131 }
1132
1133 fn serialize_tuple(self, _: usize) -> Result<Self::SerializeTuple, Self::Error> {
1134 Err(Self::bad_type(Unsupported::Tuple))
1135 }
1136
1137 fn serialize_tuple_struct(
1138 self,
1139 _: &'static str,
1140 _: usize,
1141 ) -> Result<Self::SerializeTupleStruct, Self::Error> {
1142 Err(Self::bad_type(Unsupported::TupleStruct))
1143 }
1144
1145 fn serialize_tuple_variant(
1146 self,
1147 _: &'static str,
1148 _: u32,
1149 variant: &'static str,
1150 _: usize,
1151 ) -> Result<Self::SerializeTupleVariant, Self::Error> {
1152 tri!(self.0.serialize_key(variant));
1153 Ok(FlatMapSerializeTupleVariantAsMapValue::new(self.0))
1154 }
1155
1156 fn serialize_map(self, _: Option<usize>) -> Result<Self::SerializeMap, Self::Error> {
1157 Ok(FlatMapSerializeMap(self.0))
1158 }
1159
1160 fn serialize_struct(
1161 self,
1162 _: &'static str,
1163 _: usize,
1164 ) -> Result<Self::SerializeStruct, Self::Error> {
1165 Ok(FlatMapSerializeStruct(self.0))
1166 }
1167
1168 fn serialize_struct_variant(
1169 self,
1170 _: &'static str,
1171 _: u32,
1172 inner_variant: &'static str,
1173 _: usize,
1174 ) -> Result<Self::SerializeStructVariant, Self::Error> {
1175 tri!(self.0.serialize_key(inner_variant));
1176 Ok(FlatMapSerializeStructVariantAsMapValue::new(
1177 self.0,
1178 inner_variant,
1179 ))
1180 }
1181}
1182
1183#[cfg(any(feature = "std", feature = "alloc"))]
1184pub struct FlatMapSerializeMap<'a, M: 'a>(&'a mut M);
1185
1186#[cfg(any(feature = "std", feature = "alloc"))]
1187impl<'a, M> ser::SerializeMap for FlatMapSerializeMap<'a, M>
1188where
1189 M: SerializeMap + 'a,
1190{
1191 type Ok = ();
1192 type Error = M::Error;
1193
1194 fn serialize_key<T>(&mut self, key: &T) -> Result<(), Self::Error>
1195 where
1196 T: ?Sized + Serialize,
1197 {
1198 self.0.serialize_key(key)
1199 }
1200
1201 fn serialize_value<T>(&mut self, value: &T) -> Result<(), Self::Error>
1202 where
1203 T: ?Sized + Serialize,
1204 {
1205 self.0.serialize_value(value)
1206 }
1207
1208 fn serialize_entry<K, V>(&mut self, key: &K, value: &V) -> Result<(), Self::Error>
1209 where
1210 K: ?Sized + Serialize,
1211 V: ?Sized + Serialize,
1212 {
1213 self.0.serialize_entry(key, value)
1214 }
1215
1216 fn end(self) -> Result<(), Self::Error> {
1217 Ok(())
1218 }
1219}
1220
1221#[cfg(any(feature = "std", feature = "alloc"))]
1222pub struct FlatMapSerializeStruct<'a, M: 'a>(&'a mut M);
1223
1224#[cfg(any(feature = "std", feature = "alloc"))]
1225impl<'a, M> ser::SerializeStruct for FlatMapSerializeStruct<'a, M>
1226where
1227 M: SerializeMap + 'a,
1228{
1229 type Ok = ();
1230 type Error = M::Error;
1231
1232 fn serialize_field<T>(&mut self, key: &'static str, value: &T) -> Result<(), Self::Error>
1233 where
1234 T: ?Sized + Serialize,
1235 {
1236 self.0.serialize_entry(key, value)
1237 }
1238
1239 fn end(self) -> Result<(), Self::Error> {
1240 Ok(())
1241 }
1242}
1243
1244#[cfg(any(feature = "std", feature = "alloc"))]
1247pub struct FlatMapSerializeTupleVariantAsMapValue<'a, M: 'a> {
1248 map: &'a mut M,
1249 fields: Vec<Content>,
1250}
1251
1252#[cfg(any(feature = "std", feature = "alloc"))]
1253impl<'a, M> FlatMapSerializeTupleVariantAsMapValue<'a, M>
1254where
1255 M: SerializeMap + 'a,
1256{
1257 fn new(map: &'a mut M) -> Self {
1258 FlatMapSerializeTupleVariantAsMapValue {
1259 map,
1260 fields: Vec::new(),
1261 }
1262 }
1263}
1264
1265#[cfg(any(feature = "std", feature = "alloc"))]
1266impl<'a, M> ser::SerializeTupleVariant for FlatMapSerializeTupleVariantAsMapValue<'a, M>
1267where
1268 M: SerializeMap + 'a,
1269{
1270 type Ok = ();
1271 type Error = M::Error;
1272
1273 fn serialize_field<T>(&mut self, value: &T) -> Result<(), Self::Error>
1274 where
1275 T: ?Sized + Serialize,
1276 {
1277 let value = tri!(value.serialize(ContentSerializer::<M::Error>::new()));
1278 self.fields.push(value);
1279 Ok(())
1280 }
1281
1282 fn end(self) -> Result<(), Self::Error> {
1283 tri!(self.map.serialize_value(&Content::Seq(self.fields)));
1284 Ok(())
1285 }
1286}
1287
1288#[cfg(any(feature = "std", feature = "alloc"))]
1291pub struct FlatMapSerializeStructVariantAsMapValue<'a, M: 'a> {
1292 map: &'a mut M,
1293 name: &'static str,
1294 fields: Vec<(&'static str, Content)>,
1295}
1296
1297#[cfg(any(feature = "std", feature = "alloc"))]
1298impl<'a, M> FlatMapSerializeStructVariantAsMapValue<'a, M>
1299where
1300 M: SerializeMap + 'a,
1301{
1302 fn new(map: &'a mut M, name: &'static str) -> FlatMapSerializeStructVariantAsMapValue<'a, M> {
1303 FlatMapSerializeStructVariantAsMapValue {
1304 map,
1305 name,
1306 fields: Vec::new(),
1307 }
1308 }
1309}
1310
1311#[cfg(any(feature = "std", feature = "alloc"))]
1312impl<'a, M> ser::SerializeStructVariant for FlatMapSerializeStructVariantAsMapValue<'a, M>
1313where
1314 M: SerializeMap + 'a,
1315{
1316 type Ok = ();
1317 type Error = M::Error;
1318
1319 fn serialize_field<T>(&mut self, key: &'static str, value: &T) -> Result<(), Self::Error>
1320 where
1321 T: ?Sized + Serialize,
1322 {
1323 let value = tri!(value.serialize(ContentSerializer::<M::Error>::new()));
1324 self.fields.push((key, value));
1325 Ok(())
1326 }
1327
1328 fn end(self) -> Result<(), Self::Error> {
1329 tri!(self
1330 .map
1331 .serialize_value(&Content::Struct(self.name, self.fields)));
1332 Ok(())
1333 }
1334}
1335
1336pub struct AdjacentlyTaggedEnumVariant {
1337 pub enum_name: &'static str,
1338 pub variant_index: u32,
1339 pub variant_name: &'static str,
1340}
1341
1342impl Serialize for AdjacentlyTaggedEnumVariant {
1343 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
1344 where
1345 S: Serializer,
1346 {
1347 serializer.serialize_unit_variant(self.enum_name, self.variant_index, self.variant_name)
1348 }
1349}
1350
1351pub struct CannotSerializeVariant<T>(pub T);
1354
1355impl<T> Display for CannotSerializeVariant<T>
1356where
1357 T: Debug,
1358{
1359 fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
1360 write!(formatter, "enum variant cannot be serialized: {:?}", self.0)
1361 }
1362}