1use std::cell::Cell;
29use std::error;
30use std::fmt::{self, Write};
31use std::marker;
32use std::rc::Rc;
33
34use crate::datetime;
35use serde::ser;
36
37pub fn to_vec<T: ?Sized>(value: &T) -> Result<Vec<u8>, Error>
43where
44 T: ser::Serialize,
45{
46 to_string(value).map(|e| e.into_bytes())
47}
48
49pub fn to_string<T: ?Sized>(value: &T) -> Result<String, Error>
88where
89 T: ser::Serialize,
90{
91 let mut dst = String::with_capacity(128);
92 value.serialize(&mut Serializer::new(&mut dst))?;
93 Ok(dst)
94}
95
96pub fn to_string_pretty<T: ?Sized>(value: &T) -> Result<String, Error>
101where
102 T: ser::Serialize,
103{
104 let mut dst = String::with_capacity(128);
105 value.serialize(&mut Serializer::pretty(&mut dst))?;
106 Ok(dst)
107}
108
109#[derive(Debug, PartialEq, Eq, Clone)]
111pub enum Error {
112 UnsupportedType,
118
119 KeyNotString,
122
123 #[doc(hidden)]
125 KeyNewline,
126
127 #[doc(hidden)]
129 ArrayMixedType,
130
131 ValueAfterTable,
135
136 DateInvalid,
138
139 NumberInvalid,
141
142 UnsupportedNone,
144
145 Custom(String),
148
149 #[doc(hidden)]
150 __Nonexhaustive,
151}
152
153#[derive(Debug, Default, Clone)]
154struct ArraySettings {
156 indent: usize,
157 trailing_comma: bool,
158}
159
160impl ArraySettings {
161 fn pretty() -> ArraySettings {
162 ArraySettings {
163 indent: 4,
164 trailing_comma: true,
165 }
166 }
167}
168
169#[derive(Debug, Default, Clone)]
170struct StringSettings {
172 literal: bool,
174}
175
176impl StringSettings {
177 fn pretty() -> StringSettings {
178 StringSettings { literal: true }
179 }
180}
181
182#[derive(Debug, Default, Clone)]
183struct Settings {
185 array: Option<ArraySettings>,
186 string: Option<StringSettings>,
187}
188
189pub struct Serializer<'a> {
199 dst: &'a mut String,
200 state: State<'a>,
201 settings: Rc<Settings>,
202}
203
204#[derive(Debug, Copy, Clone)]
205enum ArrayState {
206 Started,
207 StartedAsATable,
208}
209
210#[derive(Debug, Clone)]
211enum State<'a> {
212 Table {
213 key: &'a str,
214 parent: &'a State<'a>,
215 first: &'a Cell<bool>,
216 table_emitted: &'a Cell<bool>,
217 },
218 Array {
219 parent: &'a State<'a>,
220 first: &'a Cell<bool>,
221 type_: &'a Cell<Option<ArrayState>>,
222 len: Option<usize>,
223 },
224 End,
225}
226
227#[doc(hidden)]
228pub struct SerializeSeq<'a, 'b> {
229 ser: &'b mut Serializer<'a>,
230 first: Cell<bool>,
231 type_: Cell<Option<ArrayState>>,
232 len: Option<usize>,
233}
234
235#[doc(hidden)]
236pub enum SerializeTable<'a, 'b> {
237 Datetime(&'b mut Serializer<'a>),
238 Table {
239 ser: &'b mut Serializer<'a>,
240 key: String,
241 first: Cell<bool>,
242 table_emitted: Cell<bool>,
243 },
244}
245
246impl<'a> Serializer<'a> {
247 pub fn new(dst: &'a mut String) -> Serializer<'a> {
252 Serializer {
253 dst,
254 state: State::End,
255 settings: Rc::new(Settings::default()),
256 }
257 }
258
259 pub fn pretty(dst: &'a mut String) -> Serializer<'a> {
268 Serializer {
269 dst,
270 state: State::End,
271 settings: Rc::new(Settings {
272 array: Some(ArraySettings::pretty()),
273 string: Some(StringSettings::pretty()),
274 }),
275 }
276 }
277
278 pub fn pretty_string(&mut self, value: bool) -> &mut Self {
302 Rc::get_mut(&mut self.settings).unwrap().string = if value {
303 Some(StringSettings::pretty())
304 } else {
305 None
306 };
307 self
308 }
309
310 pub fn pretty_string_literal(&mut self, value: bool) -> &mut Self {
337 let use_default = if let Some(ref mut s) = Rc::get_mut(&mut self.settings).unwrap().string {
338 s.literal = value;
339 false
340 } else {
341 true
342 };
343
344 if use_default {
345 let mut string = StringSettings::pretty();
346 string.literal = value;
347 Rc::get_mut(&mut self.settings).unwrap().string = Some(string);
348 }
349 self
350 }
351
352 pub fn pretty_array(&mut self, value: bool) -> &mut Self {
380 Rc::get_mut(&mut self.settings).unwrap().array = if value {
381 Some(ArraySettings::pretty())
382 } else {
383 None
384 };
385 self
386 }
387
388 pub fn pretty_array_indent(&mut self, value: usize) -> &mut Self {
392 let use_default = if let Some(ref mut a) = Rc::get_mut(&mut self.settings).unwrap().array {
393 a.indent = value;
394 false
395 } else {
396 true
397 };
398
399 if use_default {
400 let mut array = ArraySettings::pretty();
401 array.indent = value;
402 Rc::get_mut(&mut self.settings).unwrap().array = Some(array);
403 }
404 self
405 }
406
407 pub fn pretty_array_trailing_comma(&mut self, value: bool) -> &mut Self {
411 let use_default = if let Some(ref mut a) = Rc::get_mut(&mut self.settings).unwrap().array {
412 a.trailing_comma = value;
413 false
414 } else {
415 true
416 };
417
418 if use_default {
419 let mut array = ArraySettings::pretty();
420 array.trailing_comma = value;
421 Rc::get_mut(&mut self.settings).unwrap().array = Some(array);
422 }
423 self
424 }
425
426 fn display<T: fmt::Display>(&mut self, t: T, type_: ArrayState) -> Result<(), Error> {
427 self.emit_key(type_)?;
428 write!(self.dst, "{}", t).map_err(ser::Error::custom)?;
429 if let State::Table { .. } = self.state {
430 self.dst.push_str("\n");
431 }
432 Ok(())
433 }
434
435 fn emit_key(&mut self, type_: ArrayState) -> Result<(), Error> {
436 self.array_type(type_)?;
437 let state = self.state.clone();
438 self._emit_key(&state)
439 }
440
441 fn _emit_key(&mut self, state: &State<'_>) -> Result<(), Error> {
443 match *state {
444 State::End => Ok(()),
445 State::Array {
446 parent,
447 first,
448 type_,
449 len,
450 } => {
451 assert!(type_.get().is_some());
452 if first.get() {
453 self._emit_key(parent)?;
454 }
455 self.emit_array(first, len)
456 }
457 State::Table {
458 parent,
459 first,
460 table_emitted,
461 key,
462 } => {
463 if table_emitted.get() {
464 return Err(Error::ValueAfterTable);
465 }
466 if first.get() {
467 self.emit_table_header(parent)?;
468 first.set(false);
469 }
470 self.escape_key(key)?;
471 self.dst.push_str(" = ");
472 Ok(())
473 }
474 }
475 }
476
477 fn emit_array(&mut self, first: &Cell<bool>, len: Option<usize>) -> Result<(), Error> {
478 match (len, &self.settings.array) {
479 (Some(0..=1), _) | (_, &None) => {
480 if first.get() {
481 self.dst.push_str("[")
482 } else {
483 self.dst.push_str(", ")
484 }
485 }
486 (_, &Some(ref a)) => {
487 if first.get() {
488 self.dst.push_str("[\n")
489 } else {
490 self.dst.push_str(",\n")
491 }
492 for _ in 0..a.indent {
493 self.dst.push_str(" ");
494 }
495 }
496 }
497 Ok(())
498 }
499
500 fn array_type(&mut self, type_: ArrayState) -> Result<(), Error> {
501 let prev = match self.state {
502 State::Array { type_, .. } => type_,
503 _ => return Ok(()),
504 };
505 if let None = prev.get() {
506 prev.set(Some(type_));
507 }
508 Ok(())
509 }
510
511 fn escape_key(&mut self, key: &str) -> Result<(), Error> {
512 let ok = key.chars().all(|c| match c {
513 'a'..='z' | 'A'..='Z' | '0'..='9' | '-' | '_' => true,
514 _ => false,
515 });
516 if ok {
517 write!(self.dst, "{}", key).map_err(ser::Error::custom)?;
518 } else {
519 self.emit_str(key, true)?;
520 }
521 Ok(())
522 }
523
524 fn emit_str(&mut self, value: &str, is_key: bool) -> Result<(), Error> {
525 #[derive(PartialEq)]
526 enum Type {
527 NewlineTripple,
528 OnelineTripple,
529 OnelineSingle,
530 }
531
532 enum Repr {
533 Literal(String, Type),
535 Std(Type),
537 }
538
539 fn do_pretty(value: &str) -> Repr {
540 let mut out = String::with_capacity(value.len() * 2);
550 let mut ty = Type::OnelineSingle;
551 let mut max_found_singles = 0;
553 let mut found_singles = 0;
554 let mut can_be_pretty = true;
555
556 for ch in value.chars() {
557 if can_be_pretty {
558 if ch == '\'' {
559 found_singles += 1;
560 if found_singles >= 3 {
561 can_be_pretty = false;
562 }
563 } else {
564 if found_singles > max_found_singles {
565 max_found_singles = found_singles;
566 }
567 found_singles = 0
568 }
569 match ch {
570 '\t' => {}
571 '\n' => ty = Type::NewlineTripple,
572 c if c < '\u{1f}' => can_be_pretty = false, _ => {}
575 }
576 out.push(ch);
577 } else {
578 if ch == '\n' {
581 ty = Type::NewlineTripple;
582 }
583 }
584 }
585 if can_be_pretty && found_singles > 0 && value.ends_with('\'') {
586 can_be_pretty = false;
588 }
589 if !can_be_pretty {
590 debug_assert!(ty != Type::OnelineTripple);
591 return Repr::Std(ty);
592 }
593 if found_singles > max_found_singles {
594 max_found_singles = found_singles;
595 }
596 debug_assert!(max_found_singles < 3);
597 if ty == Type::OnelineSingle && max_found_singles >= 1 {
598 ty = Type::OnelineTripple;
600 }
601 Repr::Literal(out, ty)
602 }
603
604 let repr = if !is_key && self.settings.string.is_some() {
605 match (&self.settings.string, do_pretty(value)) {
606 (&Some(StringSettings { literal: false, .. }), Repr::Literal(_, ty)) => {
607 Repr::Std(ty)
608 }
609 (_, r) => r,
610 }
611 } else {
612 Repr::Std(Type::OnelineSingle)
613 };
614 match repr {
615 Repr::Literal(literal, ty) => {
616 match ty {
618 Type::NewlineTripple => self.dst.push_str("'''\n"),
619 Type::OnelineTripple => self.dst.push_str("'''"),
620 Type::OnelineSingle => self.dst.push('\''),
621 }
622 self.dst.push_str(&literal);
623 match ty {
624 Type::OnelineSingle => self.dst.push('\''),
625 _ => self.dst.push_str("'''"),
626 }
627 }
628 Repr::Std(ty) => {
629 match ty {
630 Type::NewlineTripple => self.dst.push_str("\"\"\"\n"),
631 Type::OnelineSingle | Type::OnelineTripple => self.dst.push('"'),
635 }
636 for ch in value.chars() {
637 match ch {
638 '\u{8}' => self.dst.push_str("\\b"),
639 '\u{9}' => self.dst.push_str("\\t"),
640 '\u{a}' => match ty {
641 Type::NewlineTripple => self.dst.push('\n'),
642 Type::OnelineSingle => self.dst.push_str("\\n"),
643 _ => unreachable!(),
644 },
645 '\u{c}' => self.dst.push_str("\\f"),
646 '\u{d}' => self.dst.push_str("\\r"),
647 '\u{22}' => self.dst.push_str("\\\""),
648 '\u{5c}' => self.dst.push_str("\\\\"),
649 c if c < '\u{1f}' => {
650 write!(self.dst, "\\u{:04X}", ch as u32).map_err(ser::Error::custom)?;
651 }
652 ch => self.dst.push(ch),
653 }
654 }
655 match ty {
656 Type::NewlineTripple => self.dst.push_str("\"\"\""),
657 Type::OnelineSingle | Type::OnelineTripple => self.dst.push('"'),
658 }
659 }
660 }
661 Ok(())
662 }
663
664 fn emit_table_header(&mut self, state: &State<'_>) -> Result<(), Error> {
665 let array_of_tables = match *state {
666 State::End => return Ok(()),
667 State::Array { .. } => true,
668 _ => false,
669 };
670
671 let mut p = state;
674 if let State::Array { first, parent, .. } = *state {
675 if first.get() {
676 p = parent;
677 }
678 }
679 while let State::Table { first, parent, .. } = *p {
680 p = parent;
681 if !first.get() {
682 break;
683 }
684 if let State::Array {
685 parent: &State::Table { .. },
686 ..
687 } = *parent
688 {
689 self.emit_table_header(parent)?;
690 break;
691 }
692 }
693
694 match *state {
695 State::Table { first, .. } => {
696 if !first.get() {
697 self.dst.push('\n');
700 }
701 }
702 State::Array { parent, first, .. } => {
703 if !first.get() {
704 self.dst.push('\n');
707 } else if let State::Table { first, .. } = *parent {
708 if !first.get() {
709 self.dst.push('\n');
711 }
712 }
713 }
714 _ => {}
715 }
716 self.dst.push_str("[");
717 if array_of_tables {
718 self.dst.push_str("[");
719 }
720 self.emit_key_part(state)?;
721 if array_of_tables {
722 self.dst.push_str("]");
723 }
724 self.dst.push_str("]\n");
725 Ok(())
726 }
727
728 fn emit_key_part(&mut self, key: &State<'_>) -> Result<bool, Error> {
729 match *key {
730 State::Array { parent, .. } => self.emit_key_part(parent),
731 State::End => Ok(true),
732 State::Table {
733 key,
734 parent,
735 table_emitted,
736 ..
737 } => {
738 table_emitted.set(true);
739 let first = self.emit_key_part(parent)?;
740 if !first {
741 self.dst.push_str(".");
742 }
743 self.escape_key(key)?;
744 Ok(false)
745 }
746 }
747 }
748}
749
750macro_rules! serialize_float {
751 ($this:expr, $v:expr) => {{
752 $this.emit_key(ArrayState::Started)?;
753 if ($v.is_nan() || $v == 0.0) && $v.is_sign_negative() {
754 write!($this.dst, "-").map_err(ser::Error::custom)?;
755 }
756 if $v.is_nan() {
757 write!($this.dst, "nan").map_err(ser::Error::custom)?;
758 } else {
759 write!($this.dst, "{}", $v).map_err(ser::Error::custom)?;
760 }
761 if $v % 1.0 == 0.0 {
762 write!($this.dst, ".0").map_err(ser::Error::custom)?;
763 }
764 if let State::Table { .. } = $this.state {
765 $this.dst.push_str("\n");
766 }
767 return Ok(());
768 }};
769}
770
771impl<'a, 'b> ser::Serializer for &'b mut Serializer<'a> {
772 type Ok = ();
773 type Error = Error;
774 type SerializeSeq = SerializeSeq<'a, 'b>;
775 type SerializeTuple = SerializeSeq<'a, 'b>;
776 type SerializeTupleStruct = SerializeSeq<'a, 'b>;
777 type SerializeTupleVariant = SerializeSeq<'a, 'b>;
778 type SerializeMap = SerializeTable<'a, 'b>;
779 type SerializeStruct = SerializeTable<'a, 'b>;
780 type SerializeStructVariant = ser::Impossible<(), Error>;
781
782 fn serialize_bool(self, v: bool) -> Result<(), Self::Error> {
783 self.display(v, ArrayState::Started)
784 }
785
786 fn serialize_i8(self, v: i8) -> Result<(), Self::Error> {
787 self.display(v, ArrayState::Started)
788 }
789
790 fn serialize_i16(self, v: i16) -> Result<(), Self::Error> {
791 self.display(v, ArrayState::Started)
792 }
793
794 fn serialize_i32(self, v: i32) -> Result<(), Self::Error> {
795 self.display(v, ArrayState::Started)
796 }
797
798 fn serialize_i64(self, v: i64) -> Result<(), Self::Error> {
799 self.display(v, ArrayState::Started)
800 }
801
802 fn serialize_u8(self, v: u8) -> Result<(), Self::Error> {
803 self.display(v, ArrayState::Started)
804 }
805
806 fn serialize_u16(self, v: u16) -> Result<(), Self::Error> {
807 self.display(v, ArrayState::Started)
808 }
809
810 fn serialize_u32(self, v: u32) -> Result<(), Self::Error> {
811 self.display(v, ArrayState::Started)
812 }
813
814 fn serialize_u64(self, v: u64) -> Result<(), Self::Error> {
815 self.display(v, ArrayState::Started)
816 }
817
818 fn serialize_f32(self, v: f32) -> Result<(), Self::Error> {
819 serialize_float!(self, v)
820 }
821
822 fn serialize_f64(self, v: f64) -> Result<(), Self::Error> {
823 serialize_float!(self, v)
824 }
825
826 fn serialize_char(self, v: char) -> Result<(), Self::Error> {
827 let mut buf = [0; 4];
828 self.serialize_str(v.encode_utf8(&mut buf))
829 }
830
831 fn serialize_str(self, value: &str) -> Result<(), Self::Error> {
832 self.emit_key(ArrayState::Started)?;
833 self.emit_str(value, false)?;
834 if let State::Table { .. } = self.state {
835 self.dst.push_str("\n");
836 }
837 Ok(())
838 }
839
840 fn serialize_bytes(self, value: &[u8]) -> Result<(), Self::Error> {
841 use serde::ser::Serialize;
842 value.serialize(self)
843 }
844
845 fn serialize_none(self) -> Result<(), Self::Error> {
846 Err(Error::UnsupportedNone)
847 }
848
849 fn serialize_some<T: ?Sized>(self, value: &T) -> Result<(), Self::Error>
850 where
851 T: ser::Serialize,
852 {
853 value.serialize(self)
854 }
855
856 fn serialize_unit(self) -> Result<(), Self::Error> {
857 Err(Error::UnsupportedType)
858 }
859
860 fn serialize_unit_struct(self, _name: &'static str) -> Result<(), Self::Error> {
861 Err(Error::UnsupportedType)
862 }
863
864 fn serialize_unit_variant(
865 self,
866 _name: &'static str,
867 _variant_index: u32,
868 variant: &'static str,
869 ) -> Result<(), Self::Error> {
870 self.serialize_str(variant)
871 }
872
873 fn serialize_newtype_struct<T: ?Sized>(
874 self,
875 _name: &'static str,
876 value: &T,
877 ) -> Result<(), Self::Error>
878 where
879 T: ser::Serialize,
880 {
881 value.serialize(self)
882 }
883
884 fn serialize_newtype_variant<T: ?Sized>(
885 self,
886 _name: &'static str,
887 _variant_index: u32,
888 _variant: &'static str,
889 _value: &T,
890 ) -> Result<(), Self::Error>
891 where
892 T: ser::Serialize,
893 {
894 Err(Error::UnsupportedType)
895 }
896
897 fn serialize_seq(self, len: Option<usize>) -> Result<Self::SerializeSeq, Self::Error> {
898 self.array_type(ArrayState::Started)?;
899 Ok(SerializeSeq {
900 ser: self,
901 first: Cell::new(true),
902 type_: Cell::new(None),
903 len,
904 })
905 }
906
907 fn serialize_tuple(self, len: usize) -> Result<Self::SerializeTuple, Self::Error> {
908 self.serialize_seq(Some(len))
909 }
910
911 fn serialize_tuple_struct(
912 self,
913 _name: &'static str,
914 len: usize,
915 ) -> Result<Self::SerializeTupleStruct, Self::Error> {
916 self.serialize_seq(Some(len))
917 }
918
919 fn serialize_tuple_variant(
920 self,
921 _name: &'static str,
922 _variant_index: u32,
923 _variant: &'static str,
924 len: usize,
925 ) -> Result<Self::SerializeTupleVariant, Self::Error> {
926 self.serialize_seq(Some(len))
927 }
928
929 fn serialize_map(self, _len: Option<usize>) -> Result<Self::SerializeMap, Self::Error> {
930 self.array_type(ArrayState::StartedAsATable)?;
931 Ok(SerializeTable::Table {
932 ser: self,
933 key: String::new(),
934 first: Cell::new(true),
935 table_emitted: Cell::new(false),
936 })
937 }
938
939 fn serialize_struct(
940 self,
941 name: &'static str,
942 _len: usize,
943 ) -> Result<Self::SerializeStruct, Self::Error> {
944 if name == datetime::NAME {
945 self.array_type(ArrayState::Started)?;
946 Ok(SerializeTable::Datetime(self))
947 } else {
948 self.array_type(ArrayState::StartedAsATable)?;
949 Ok(SerializeTable::Table {
950 ser: self,
951 key: String::new(),
952 first: Cell::new(true),
953 table_emitted: Cell::new(false),
954 })
955 }
956 }
957
958 fn serialize_struct_variant(
959 self,
960 _name: &'static str,
961 _variant_index: u32,
962 _variant: &'static str,
963 _len: usize,
964 ) -> Result<Self::SerializeStructVariant, Self::Error> {
965 Err(Error::UnsupportedType)
966 }
967}
968
969impl<'a, 'b> ser::SerializeSeq for SerializeSeq<'a, 'b> {
970 type Ok = ();
971 type Error = Error;
972
973 fn serialize_element<T: ?Sized>(&mut self, value: &T) -> Result<(), Error>
974 where
975 T: ser::Serialize,
976 {
977 value.serialize(&mut Serializer {
978 dst: &mut *self.ser.dst,
979 state: State::Array {
980 parent: &self.ser.state,
981 first: &self.first,
982 type_: &self.type_,
983 len: self.len,
984 },
985 settings: self.ser.settings.clone(),
986 })?;
987 self.first.set(false);
988 Ok(())
989 }
990
991 fn end(self) -> Result<(), Error> {
992 match self.type_.get() {
993 Some(ArrayState::StartedAsATable) => return Ok(()),
994 Some(ArrayState::Started) => match (self.len, &self.ser.settings.array) {
995 (Some(0..=1), _) | (_, &None) => {
996 self.ser.dst.push_str("]");
997 }
998 (_, &Some(ref a)) => {
999 if a.trailing_comma {
1000 self.ser.dst.push_str(",");
1001 }
1002 self.ser.dst.push_str("\n]");
1003 }
1004 },
1005 None => {
1006 assert!(self.first.get());
1007 self.ser.emit_key(ArrayState::Started)?;
1008 self.ser.dst.push_str("[]")
1009 }
1010 }
1011 if let State::Table { .. } = self.ser.state {
1012 self.ser.dst.push_str("\n");
1013 }
1014 Ok(())
1015 }
1016}
1017
1018impl<'a, 'b> ser::SerializeTuple for SerializeSeq<'a, 'b> {
1019 type Ok = ();
1020 type Error = Error;
1021
1022 fn serialize_element<T: ?Sized>(&mut self, value: &T) -> Result<(), Error>
1023 where
1024 T: ser::Serialize,
1025 {
1026 ser::SerializeSeq::serialize_element(self, value)
1027 }
1028
1029 fn end(self) -> Result<(), Error> {
1030 ser::SerializeSeq::end(self)
1031 }
1032}
1033
1034impl<'a, 'b> ser::SerializeTupleVariant for SerializeSeq<'a, 'b> {
1035 type Ok = ();
1036 type Error = Error;
1037
1038 fn serialize_field<T: ?Sized>(&mut self, value: &T) -> Result<(), Error>
1039 where
1040 T: ser::Serialize,
1041 {
1042 ser::SerializeSeq::serialize_element(self, value)
1043 }
1044
1045 fn end(self) -> Result<(), Error> {
1046 ser::SerializeSeq::end(self)
1047 }
1048}
1049
1050impl<'a, 'b> ser::SerializeTupleStruct for SerializeSeq<'a, 'b> {
1051 type Ok = ();
1052 type Error = Error;
1053
1054 fn serialize_field<T: ?Sized>(&mut self, value: &T) -> Result<(), Error>
1055 where
1056 T: ser::Serialize,
1057 {
1058 ser::SerializeSeq::serialize_element(self, value)
1059 }
1060
1061 fn end(self) -> Result<(), Error> {
1062 ser::SerializeSeq::end(self)
1063 }
1064}
1065
1066impl<'a, 'b> ser::SerializeMap for SerializeTable<'a, 'b> {
1067 type Ok = ();
1068 type Error = Error;
1069
1070 fn serialize_key<T: ?Sized>(&mut self, input: &T) -> Result<(), Error>
1071 where
1072 T: ser::Serialize,
1073 {
1074 match *self {
1075 SerializeTable::Datetime(_) => panic!(), SerializeTable::Table { ref mut key, .. } => {
1077 key.truncate(0);
1078 *key = input.serialize(StringExtractor)?;
1079 }
1080 }
1081 Ok(())
1082 }
1083
1084 fn serialize_value<T: ?Sized>(&mut self, value: &T) -> Result<(), Error>
1085 where
1086 T: ser::Serialize,
1087 {
1088 match *self {
1089 SerializeTable::Datetime(_) => panic!(), SerializeTable::Table {
1091 ref mut ser,
1092 ref key,
1093 ref first,
1094 ref table_emitted,
1095 ..
1096 } => {
1097 let res = value.serialize(&mut Serializer {
1098 dst: &mut *ser.dst,
1099 state: State::Table {
1100 key,
1101 parent: &ser.state,
1102 first,
1103 table_emitted,
1104 },
1105 settings: ser.settings.clone(),
1106 });
1107 match res {
1108 Ok(()) => first.set(false),
1109 Err(Error::UnsupportedNone) => {}
1110 Err(e) => return Err(e),
1111 }
1112 }
1113 }
1114 Ok(())
1115 }
1116
1117 fn end(self) -> Result<(), Error> {
1118 match self {
1119 SerializeTable::Datetime(_) => panic!(), SerializeTable::Table { ser, first, .. } => {
1121 if first.get() {
1122 let state = ser.state.clone();
1123 ser.emit_table_header(&state)?;
1124 }
1125 }
1126 }
1127 Ok(())
1128 }
1129}
1130
1131impl<'a, 'b> ser::SerializeStruct for SerializeTable<'a, 'b> {
1132 type Ok = ();
1133 type Error = Error;
1134
1135 fn serialize_field<T: ?Sized>(&mut self, key: &'static str, value: &T) -> Result<(), Error>
1136 where
1137 T: ser::Serialize,
1138 {
1139 match *self {
1140 SerializeTable::Datetime(ref mut ser) => {
1141 if key == datetime::FIELD {
1142 value.serialize(DateStrEmitter(&mut *ser))?;
1143 } else {
1144 return Err(Error::DateInvalid);
1145 }
1146 }
1147 SerializeTable::Table {
1148 ref mut ser,
1149 ref first,
1150 ref table_emitted,
1151 ..
1152 } => {
1153 let res = value.serialize(&mut Serializer {
1154 dst: &mut *ser.dst,
1155 state: State::Table {
1156 key,
1157 parent: &ser.state,
1158 first,
1159 table_emitted,
1160 },
1161 settings: ser.settings.clone(),
1162 });
1163 match res {
1164 Ok(()) => first.set(false),
1165 Err(Error::UnsupportedNone) => {}
1166 Err(e) => return Err(e),
1167 }
1168 }
1169 }
1170 Ok(())
1171 }
1172
1173 fn end(self) -> Result<(), Error> {
1174 match self {
1175 SerializeTable::Datetime(_) => {}
1176 SerializeTable::Table { ser, first, .. } => {
1177 if first.get() {
1178 let state = ser.state.clone();
1179 ser.emit_table_header(&state)?;
1180 }
1181 }
1182 }
1183 Ok(())
1184 }
1185}
1186
1187struct DateStrEmitter<'a, 'b>(&'b mut Serializer<'a>);
1188
1189impl<'a, 'b> ser::Serializer for DateStrEmitter<'a, 'b> {
1190 type Ok = ();
1191 type Error = Error;
1192 type SerializeSeq = ser::Impossible<(), Error>;
1193 type SerializeTuple = ser::Impossible<(), Error>;
1194 type SerializeTupleStruct = ser::Impossible<(), Error>;
1195 type SerializeTupleVariant = ser::Impossible<(), Error>;
1196 type SerializeMap = ser::Impossible<(), Error>;
1197 type SerializeStruct = ser::Impossible<(), Error>;
1198 type SerializeStructVariant = ser::Impossible<(), Error>;
1199
1200 fn serialize_bool(self, _v: bool) -> Result<(), Self::Error> {
1201 Err(Error::DateInvalid)
1202 }
1203
1204 fn serialize_i8(self, _v: i8) -> Result<(), Self::Error> {
1205 Err(Error::DateInvalid)
1206 }
1207
1208 fn serialize_i16(self, _v: i16) -> Result<(), Self::Error> {
1209 Err(Error::DateInvalid)
1210 }
1211
1212 fn serialize_i32(self, _v: i32) -> Result<(), Self::Error> {
1213 Err(Error::DateInvalid)
1214 }
1215
1216 fn serialize_i64(self, _v: i64) -> Result<(), Self::Error> {
1217 Err(Error::DateInvalid)
1218 }
1219
1220 fn serialize_u8(self, _v: u8) -> Result<(), Self::Error> {
1221 Err(Error::DateInvalid)
1222 }
1223
1224 fn serialize_u16(self, _v: u16) -> Result<(), Self::Error> {
1225 Err(Error::DateInvalid)
1226 }
1227
1228 fn serialize_u32(self, _v: u32) -> Result<(), Self::Error> {
1229 Err(Error::DateInvalid)
1230 }
1231
1232 fn serialize_u64(self, _v: u64) -> Result<(), Self::Error> {
1233 Err(Error::DateInvalid)
1234 }
1235
1236 fn serialize_f32(self, _v: f32) -> Result<(), Self::Error> {
1237 Err(Error::DateInvalid)
1238 }
1239
1240 fn serialize_f64(self, _v: f64) -> Result<(), Self::Error> {
1241 Err(Error::DateInvalid)
1242 }
1243
1244 fn serialize_char(self, _v: char) -> Result<(), Self::Error> {
1245 Err(Error::DateInvalid)
1246 }
1247
1248 fn serialize_str(self, value: &str) -> Result<(), Self::Error> {
1249 self.0.display(value, ArrayState::Started)?;
1250 Ok(())
1251 }
1252
1253 fn serialize_bytes(self, _value: &[u8]) -> Result<(), Self::Error> {
1254 Err(Error::DateInvalid)
1255 }
1256
1257 fn serialize_none(self) -> Result<(), Self::Error> {
1258 Err(Error::DateInvalid)
1259 }
1260
1261 fn serialize_some<T: ?Sized>(self, _value: &T) -> Result<(), Self::Error>
1262 where
1263 T: ser::Serialize,
1264 {
1265 Err(Error::DateInvalid)
1266 }
1267
1268 fn serialize_unit(self) -> Result<(), Self::Error> {
1269 Err(Error::DateInvalid)
1270 }
1271
1272 fn serialize_unit_struct(self, _name: &'static str) -> Result<(), Self::Error> {
1273 Err(Error::DateInvalid)
1274 }
1275
1276 fn serialize_unit_variant(
1277 self,
1278 _name: &'static str,
1279 _variant_index: u32,
1280 _variant: &'static str,
1281 ) -> Result<(), Self::Error> {
1282 Err(Error::DateInvalid)
1283 }
1284
1285 fn serialize_newtype_struct<T: ?Sized>(
1286 self,
1287 _name: &'static str,
1288 _value: &T,
1289 ) -> Result<(), Self::Error>
1290 where
1291 T: ser::Serialize,
1292 {
1293 Err(Error::DateInvalid)
1294 }
1295
1296 fn serialize_newtype_variant<T: ?Sized>(
1297 self,
1298 _name: &'static str,
1299 _variant_index: u32,
1300 _variant: &'static str,
1301 _value: &T,
1302 ) -> Result<(), Self::Error>
1303 where
1304 T: ser::Serialize,
1305 {
1306 Err(Error::DateInvalid)
1307 }
1308
1309 fn serialize_seq(self, _len: Option<usize>) -> Result<Self::SerializeSeq, Self::Error> {
1310 Err(Error::DateInvalid)
1311 }
1312
1313 fn serialize_tuple(self, _len: usize) -> Result<Self::SerializeTuple, Self::Error> {
1314 Err(Error::DateInvalid)
1315 }
1316
1317 fn serialize_tuple_struct(
1318 self,
1319 _name: &'static str,
1320 _len: usize,
1321 ) -> Result<Self::SerializeTupleStruct, Self::Error> {
1322 Err(Error::DateInvalid)
1323 }
1324
1325 fn serialize_tuple_variant(
1326 self,
1327 _name: &'static str,
1328 _variant_index: u32,
1329 _variant: &'static str,
1330 _len: usize,
1331 ) -> Result<Self::SerializeTupleVariant, Self::Error> {
1332 Err(Error::DateInvalid)
1333 }
1334
1335 fn serialize_map(self, _len: Option<usize>) -> Result<Self::SerializeMap, Self::Error> {
1336 Err(Error::DateInvalid)
1337 }
1338
1339 fn serialize_struct(
1340 self,
1341 _name: &'static str,
1342 _len: usize,
1343 ) -> Result<Self::SerializeStruct, Self::Error> {
1344 Err(Error::DateInvalid)
1345 }
1346
1347 fn serialize_struct_variant(
1348 self,
1349 _name: &'static str,
1350 _variant_index: u32,
1351 _variant: &'static str,
1352 _len: usize,
1353 ) -> Result<Self::SerializeStructVariant, Self::Error> {
1354 Err(Error::DateInvalid)
1355 }
1356}
1357
1358struct StringExtractor;
1359
1360impl ser::Serializer for StringExtractor {
1361 type Ok = String;
1362 type Error = Error;
1363 type SerializeSeq = ser::Impossible<String, Error>;
1364 type SerializeTuple = ser::Impossible<String, Error>;
1365 type SerializeTupleStruct = ser::Impossible<String, Error>;
1366 type SerializeTupleVariant = ser::Impossible<String, Error>;
1367 type SerializeMap = ser::Impossible<String, Error>;
1368 type SerializeStruct = ser::Impossible<String, Error>;
1369 type SerializeStructVariant = ser::Impossible<String, Error>;
1370
1371 fn serialize_bool(self, _v: bool) -> Result<String, Self::Error> {
1372 Err(Error::KeyNotString)
1373 }
1374
1375 fn serialize_i8(self, _v: i8) -> Result<String, Self::Error> {
1376 Err(Error::KeyNotString)
1377 }
1378
1379 fn serialize_i16(self, _v: i16) -> Result<String, Self::Error> {
1380 Err(Error::KeyNotString)
1381 }
1382
1383 fn serialize_i32(self, _v: i32) -> Result<String, Self::Error> {
1384 Err(Error::KeyNotString)
1385 }
1386
1387 fn serialize_i64(self, _v: i64) -> Result<String, Self::Error> {
1388 Err(Error::KeyNotString)
1389 }
1390
1391 fn serialize_u8(self, _v: u8) -> Result<String, Self::Error> {
1392 Err(Error::KeyNotString)
1393 }
1394
1395 fn serialize_u16(self, _v: u16) -> Result<String, Self::Error> {
1396 Err(Error::KeyNotString)
1397 }
1398
1399 fn serialize_u32(self, _v: u32) -> Result<String, Self::Error> {
1400 Err(Error::KeyNotString)
1401 }
1402
1403 fn serialize_u64(self, _v: u64) -> Result<String, Self::Error> {
1404 Err(Error::KeyNotString)
1405 }
1406
1407 fn serialize_f32(self, _v: f32) -> Result<String, Self::Error> {
1408 Err(Error::KeyNotString)
1409 }
1410
1411 fn serialize_f64(self, _v: f64) -> Result<String, Self::Error> {
1412 Err(Error::KeyNotString)
1413 }
1414
1415 fn serialize_char(self, _v: char) -> Result<String, Self::Error> {
1416 Err(Error::KeyNotString)
1417 }
1418
1419 fn serialize_str(self, value: &str) -> Result<String, Self::Error> {
1420 Ok(value.to_string())
1421 }
1422
1423 fn serialize_bytes(self, _value: &[u8]) -> Result<String, Self::Error> {
1424 Err(Error::KeyNotString)
1425 }
1426
1427 fn serialize_none(self) -> Result<String, Self::Error> {
1428 Err(Error::KeyNotString)
1429 }
1430
1431 fn serialize_some<T: ?Sized>(self, _value: &T) -> Result<String, Self::Error>
1432 where
1433 T: ser::Serialize,
1434 {
1435 Err(Error::KeyNotString)
1436 }
1437
1438 fn serialize_unit(self) -> Result<String, Self::Error> {
1439 Err(Error::KeyNotString)
1440 }
1441
1442 fn serialize_unit_struct(self, _name: &'static str) -> Result<String, Self::Error> {
1443 Err(Error::KeyNotString)
1444 }
1445
1446 fn serialize_unit_variant(
1447 self,
1448 _name: &'static str,
1449 _variant_index: u32,
1450 _variant: &'static str,
1451 ) -> Result<String, Self::Error> {
1452 Err(Error::KeyNotString)
1453 }
1454
1455 fn serialize_newtype_struct<T: ?Sized>(
1456 self,
1457 _name: &'static str,
1458 value: &T,
1459 ) -> Result<String, Self::Error>
1460 where
1461 T: ser::Serialize,
1462 {
1463 value.serialize(self)
1464 }
1465
1466 fn serialize_newtype_variant<T: ?Sized>(
1467 self,
1468 _name: &'static str,
1469 _variant_index: u32,
1470 _variant: &'static str,
1471 _value: &T,
1472 ) -> Result<String, Self::Error>
1473 where
1474 T: ser::Serialize,
1475 {
1476 Err(Error::KeyNotString)
1477 }
1478
1479 fn serialize_seq(self, _len: Option<usize>) -> Result<Self::SerializeSeq, Self::Error> {
1480 Err(Error::KeyNotString)
1481 }
1482
1483 fn serialize_tuple(self, _len: usize) -> Result<Self::SerializeTuple, Self::Error> {
1484 Err(Error::KeyNotString)
1485 }
1486
1487 fn serialize_tuple_struct(
1488 self,
1489 _name: &'static str,
1490 _len: usize,
1491 ) -> Result<Self::SerializeTupleStruct, Self::Error> {
1492 Err(Error::KeyNotString)
1493 }
1494
1495 fn serialize_tuple_variant(
1496 self,
1497 _name: &'static str,
1498 _variant_index: u32,
1499 _variant: &'static str,
1500 _len: usize,
1501 ) -> Result<Self::SerializeTupleVariant, Self::Error> {
1502 Err(Error::KeyNotString)
1503 }
1504
1505 fn serialize_map(self, _len: Option<usize>) -> Result<Self::SerializeMap, Self::Error> {
1506 Err(Error::KeyNotString)
1507 }
1508
1509 fn serialize_struct(
1510 self,
1511 _name: &'static str,
1512 _len: usize,
1513 ) -> Result<Self::SerializeStruct, Self::Error> {
1514 Err(Error::KeyNotString)
1515 }
1516
1517 fn serialize_struct_variant(
1518 self,
1519 _name: &'static str,
1520 _variant_index: u32,
1521 _variant: &'static str,
1522 _len: usize,
1523 ) -> Result<Self::SerializeStructVariant, Self::Error> {
1524 Err(Error::KeyNotString)
1525 }
1526}
1527
1528impl fmt::Display for Error {
1529 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
1530 match *self {
1531 Error::UnsupportedType => "unsupported Rust type".fmt(f),
1532 Error::KeyNotString => "map key was not a string".fmt(f),
1533 Error::ValueAfterTable => "values must be emitted before tables".fmt(f),
1534 Error::DateInvalid => "a serialized date was invalid".fmt(f),
1535 Error::NumberInvalid => "a serialized number was invalid".fmt(f),
1536 Error::UnsupportedNone => "unsupported None value".fmt(f),
1537 Error::Custom(ref s) => s.fmt(f),
1538 Error::KeyNewline => unreachable!(),
1539 Error::ArrayMixedType => unreachable!(),
1540 Error::__Nonexhaustive => panic!(),
1541 }
1542 }
1543}
1544
1545impl error::Error for Error {}
1546
1547impl ser::Error for Error {
1548 fn custom<T: fmt::Display>(msg: T) -> Error {
1549 Error::Custom(msg.to_string())
1550 }
1551}
1552
1553enum Category {
1554 Primitive,
1555 Array,
1556 Table,
1557}
1558
1559pub fn tables_last<'a, I, K, V, S>(data: &'a I, serializer: S) -> Result<S::Ok, S::Error>
1580where
1581 &'a I: IntoIterator<Item = (K, V)>,
1582 K: ser::Serialize,
1583 V: ser::Serialize,
1584 S: ser::Serializer,
1585{
1586 use serde::ser::SerializeMap;
1587
1588 let mut map = serializer.serialize_map(None)?;
1589 for (k, v) in data {
1590 if let Category::Primitive = v.serialize(Categorize::new())? {
1591 map.serialize_entry(&k, &v)?;
1592 }
1593 }
1594 for (k, v) in data {
1595 if let Category::Array = v.serialize(Categorize::new())? {
1596 map.serialize_entry(&k, &v)?;
1597 }
1598 }
1599 for (k, v) in data {
1600 if let Category::Table = v.serialize(Categorize::new())? {
1601 map.serialize_entry(&k, &v)?;
1602 }
1603 }
1604 map.end()
1605}
1606
1607struct Categorize<E>(marker::PhantomData<E>);
1608
1609impl<E> Categorize<E> {
1610 fn new() -> Self {
1611 Categorize(marker::PhantomData)
1612 }
1613}
1614
1615impl<E: ser::Error> ser::Serializer for Categorize<E> {
1616 type Ok = Category;
1617 type Error = E;
1618 type SerializeSeq = Self;
1619 type SerializeTuple = Self;
1620 type SerializeTupleStruct = Self;
1621 type SerializeTupleVariant = Self;
1622 type SerializeMap = Self;
1623 type SerializeStruct = Self;
1624 type SerializeStructVariant = ser::Impossible<Category, E>;
1625
1626 fn serialize_bool(self, _: bool) -> Result<Self::Ok, Self::Error> {
1627 Ok(Category::Primitive)
1628 }
1629
1630 fn serialize_i8(self, _: i8) -> Result<Self::Ok, Self::Error> {
1631 Ok(Category::Primitive)
1632 }
1633
1634 fn serialize_i16(self, _: i16) -> Result<Self::Ok, Self::Error> {
1635 Ok(Category::Primitive)
1636 }
1637
1638 fn serialize_i32(self, _: i32) -> Result<Self::Ok, Self::Error> {
1639 Ok(Category::Primitive)
1640 }
1641
1642 fn serialize_i64(self, _: i64) -> Result<Self::Ok, Self::Error> {
1643 Ok(Category::Primitive)
1644 }
1645
1646 fn serialize_u8(self, _: u8) -> Result<Self::Ok, Self::Error> {
1647 Ok(Category::Primitive)
1648 }
1649
1650 fn serialize_u16(self, _: u16) -> Result<Self::Ok, Self::Error> {
1651 Ok(Category::Primitive)
1652 }
1653
1654 fn serialize_u32(self, _: u32) -> Result<Self::Ok, Self::Error> {
1655 Ok(Category::Primitive)
1656 }
1657
1658 fn serialize_u64(self, _: u64) -> Result<Self::Ok, Self::Error> {
1659 Ok(Category::Primitive)
1660 }
1661
1662 fn serialize_f32(self, _: f32) -> Result<Self::Ok, Self::Error> {
1663 Ok(Category::Primitive)
1664 }
1665
1666 fn serialize_f64(self, _: f64) -> Result<Self::Ok, Self::Error> {
1667 Ok(Category::Primitive)
1668 }
1669
1670 fn serialize_char(self, _: char) -> Result<Self::Ok, Self::Error> {
1671 Ok(Category::Primitive)
1672 }
1673
1674 fn serialize_str(self, _: &str) -> Result<Self::Ok, Self::Error> {
1675 Ok(Category::Primitive)
1676 }
1677
1678 fn serialize_bytes(self, _: &[u8]) -> Result<Self::Ok, Self::Error> {
1679 Ok(Category::Array)
1680 }
1681
1682 fn serialize_none(self) -> Result<Self::Ok, Self::Error> {
1683 Err(ser::Error::custom("unsupported"))
1684 }
1685
1686 fn serialize_some<T: ?Sized + ser::Serialize>(self, v: &T) -> Result<Self::Ok, Self::Error> {
1687 v.serialize(self)
1688 }
1689
1690 fn serialize_unit(self) -> Result<Self::Ok, Self::Error> {
1691 Err(ser::Error::custom("unsupported"))
1692 }
1693
1694 fn serialize_unit_struct(self, _: &'static str) -> Result<Self::Ok, Self::Error> {
1695 Err(ser::Error::custom("unsupported"))
1696 }
1697
1698 fn serialize_unit_variant(
1699 self,
1700 _: &'static str,
1701 _: u32,
1702 _: &'static str,
1703 ) -> Result<Self::Ok, Self::Error> {
1704 Err(ser::Error::custom("unsupported"))
1705 }
1706
1707 fn serialize_newtype_struct<T: ?Sized + ser::Serialize>(
1708 self,
1709 _: &'static str,
1710 v: &T,
1711 ) -> Result<Self::Ok, Self::Error> {
1712 v.serialize(self)
1713 }
1714
1715 fn serialize_newtype_variant<T: ?Sized + ser::Serialize>(
1716 self,
1717 _: &'static str,
1718 _: u32,
1719 _: &'static str,
1720 _: &T,
1721 ) -> Result<Self::Ok, Self::Error> {
1722 Err(ser::Error::custom("unsupported"))
1723 }
1724
1725 fn serialize_seq(self, _: Option<usize>) -> Result<Self, Self::Error> {
1726 Ok(self)
1727 }
1728
1729 fn serialize_tuple(self, _: usize) -> Result<Self::SerializeTuple, Self::Error> {
1730 Ok(self)
1731 }
1732
1733 fn serialize_tuple_struct(
1734 self,
1735 _: &'static str,
1736 _: usize,
1737 ) -> Result<Self::SerializeTupleStruct, Self::Error> {
1738 Ok(self)
1739 }
1740
1741 fn serialize_tuple_variant(
1742 self,
1743 _: &'static str,
1744 _: u32,
1745 _: &'static str,
1746 _: usize,
1747 ) -> Result<Self::SerializeTupleVariant, Self::Error> {
1748 Ok(self)
1749 }
1750
1751 fn serialize_map(self, _: Option<usize>) -> Result<Self, Self::Error> {
1752 Ok(self)
1753 }
1754
1755 fn serialize_struct(self, _: &'static str, _: usize) -> Result<Self, Self::Error> {
1756 Ok(self)
1757 }
1758
1759 fn serialize_struct_variant(
1760 self,
1761 _: &'static str,
1762 _: u32,
1763 _: &'static str,
1764 _: usize,
1765 ) -> Result<Self::SerializeStructVariant, Self::Error> {
1766 Err(ser::Error::custom("unsupported"))
1767 }
1768}
1769
1770impl<E: ser::Error> ser::SerializeSeq for Categorize<E> {
1771 type Ok = Category;
1772 type Error = E;
1773
1774 fn serialize_element<T: ?Sized + ser::Serialize>(&mut self, _: &T) -> Result<(), Self::Error> {
1775 Ok(())
1776 }
1777
1778 fn end(self) -> Result<Self::Ok, Self::Error> {
1779 Ok(Category::Array)
1780 }
1781}
1782
1783impl<E: ser::Error> ser::SerializeTuple for Categorize<E> {
1784 type Ok = Category;
1785 type Error = E;
1786
1787 fn serialize_element<T: ?Sized + ser::Serialize>(&mut self, _: &T) -> Result<(), Self::Error> {
1788 Ok(())
1789 }
1790
1791 fn end(self) -> Result<Self::Ok, Self::Error> {
1792 Ok(Category::Array)
1793 }
1794}
1795
1796impl<E: ser::Error> ser::SerializeTupleVariant for Categorize<E> {
1797 type Ok = Category;
1798 type Error = E;
1799
1800 fn serialize_field<T: ?Sized + ser::Serialize>(&mut self, _: &T) -> Result<(), Self::Error> {
1801 Ok(())
1802 }
1803
1804 fn end(self) -> Result<Self::Ok, Self::Error> {
1805 Ok(Category::Array)
1806 }
1807}
1808
1809impl<E: ser::Error> ser::SerializeTupleStruct for Categorize<E> {
1810 type Ok = Category;
1811 type Error = E;
1812
1813 fn serialize_field<T: ?Sized + ser::Serialize>(&mut self, _: &T) -> Result<(), Self::Error> {
1814 Ok(())
1815 }
1816
1817 fn end(self) -> Result<Self::Ok, Self::Error> {
1818 Ok(Category::Array)
1819 }
1820}
1821
1822impl<E: ser::Error> ser::SerializeMap for Categorize<E> {
1823 type Ok = Category;
1824 type Error = E;
1825
1826 fn serialize_key<T: ?Sized + ser::Serialize>(&mut self, _: &T) -> Result<(), Self::Error> {
1827 Ok(())
1828 }
1829
1830 fn serialize_value<T: ?Sized + ser::Serialize>(&mut self, _: &T) -> Result<(), Self::Error> {
1831 Ok(())
1832 }
1833
1834 fn end(self) -> Result<Self::Ok, Self::Error> {
1835 Ok(Category::Table)
1836 }
1837}
1838
1839impl<E: ser::Error> ser::SerializeStruct for Categorize<E> {
1840 type Ok = Category;
1841 type Error = E;
1842
1843 fn serialize_field<T: ?Sized>(&mut self, _: &'static str, _: &T) -> Result<(), Self::Error>
1844 where
1845 T: ser::Serialize,
1846 {
1847 Ok(())
1848 }
1849
1850 fn end(self) -> Result<Self::Ok, Self::Error> {
1851 Ok(Category::Table)
1852 }
1853}