1use serde::de::{Deserialize, Deserializer};
34use serde::ser::{
35 self, Serialize, SerializeMap, SerializeSeq, SerializeStruct, SerializeStructVariant,
36 SerializeTuple, SerializeTupleStruct, SerializeTupleVariant, Serializer,
37};
38use std::collections::HashMap;
39use std::fmt::{self, Write};
40use std::rc::{Rc, Weak as RcWeak};
41use std::sync::{Arc, Weak as ArcWeak};
42
43use crate::serializer_options::{SerializerOptions, FOLDED_WRAP_CHARS, MIN_FOLD_CHARS};
44use crate::{ArcAnchor, ArcWeakAnchor, RcAnchor, RcWeakAnchor};
45use base64::{engine::general_purpose::STANDARD as B64, Engine as _};
46use nohash_hasher::BuildNoHashHasher;
47
48pub use crate::ser_error::Error;
53use crate::ser_quoting::{is_plain_safe, is_plain_value_safe};
54
55pub type Result<T> = std::result::Result<T, Error>;
57
58#[derive(Clone, Debug, PartialEq, Eq)]
60pub struct FlowSeq<T>(pub T);
61#[derive(Clone, Debug, PartialEq, Eq)]
63pub struct FlowMap<T>(pub T);
64
65#[derive(Clone, Debug, PartialEq, Eq)]
115pub struct Commented<T>(pub T, pub String);
116
117#[derive(Clone, Copy)]
153pub struct LitStr<'a>(pub &'a str);
154
155#[derive(Clone, Debug, PartialEq, Eq)]
168pub struct LitString(pub String);
169
170#[derive(Clone, Copy)]
206pub struct FoldStr<'a>(pub &'a str);
207
208#[derive(Clone, Debug, PartialEq, Eq)]
220pub struct FoldString(pub String);
221
222#[allow(dead_code)]
229struct RcStrongPayload<'a, T>(&'a Rc<T>);
230#[allow(dead_code)]
231struct ArcStrongPayload<'a, T>(&'a Arc<T>);
232
233#[allow(dead_code)]
235struct RcWeakPayload<'a, T>(&'a RcWeak<T>);
236#[allow(dead_code)]
237struct ArcWeakPayload<'a, T>(&'a ArcWeak<T>);
238
239const NAME_TUPLE_ANCHOR: &str = "__yaml_anchor";
241const NAME_TUPLE_WEAK: &str = "__yaml_weak_anchor";
242const NAME_FLOW_SEQ: &str = "__yaml_flow_seq";
243const NAME_FLOW_MAP: &str = "__yaml_flow_map";
244const NAME_LIT_STR: &str = "__yaml_lit_str";
245const NAME_FOLD_STR: &str = "__yaml_fold_str";
246const NAME_TUPLE_COMMENTED: &str = "__yaml_commented";
247
248impl<T: Serialize> Serialize for RcAnchor<T> {
250 fn serialize<S: Serializer>(&self, s: S) -> std::result::Result<S::Ok, S::Error> {
251 let mut ts = s.serialize_tuple_struct(NAME_TUPLE_ANCHOR, 2)?;
253 let ptr = Rc::as_ptr(&self.0) as *const T as usize;
254 ts.serialize_field(&ptr)?;
255 ts.serialize_field(&*self.0)?;
256 ts.end()
257 }
258}
259impl<T: Serialize> Serialize for ArcAnchor<T> {
260 fn serialize<S: Serializer>(&self, s: S) -> std::result::Result<S::Ok, S::Error> {
261 let mut ts = s.serialize_tuple_struct(NAME_TUPLE_ANCHOR, 2)?;
262 let ptr = Arc::as_ptr(&self.0) as *const T as usize;
263 ts.serialize_field(&ptr)?;
264 ts.serialize_field(&*self.0)?;
265 ts.end()
266 }
267}
268impl<T: Serialize> Serialize for RcWeakAnchor<T> {
269 fn serialize<S: Serializer>(&self, s: S) -> std::result::Result<S::Ok, S::Error> {
270 let up = self.0.upgrade();
271 let mut ts = s.serialize_tuple_struct(NAME_TUPLE_WEAK, 3)?;
272 let ptr = self.0.as_ptr() as *const T as usize;
273 ts.serialize_field(&ptr)?;
274 ts.serialize_field(&up.is_some())?;
275 if let Some(rc) = up {
276 ts.serialize_field(&*rc)?;
277 } else {
278 ts.serialize_field(&())?; }
280 ts.end()
281 }
282}
283impl<T: Serialize> Serialize for ArcWeakAnchor<T> {
284 fn serialize<S: Serializer>(&self, s: S) -> std::result::Result<S::Ok, S::Error> {
285 let up = self.0.upgrade();
286 let mut ts = s.serialize_tuple_struct(NAME_TUPLE_WEAK, 3)?;
287 let ptr = self.0.as_ptr() as *const T as usize;
288 ts.serialize_field(&ptr)?;
289 ts.serialize_field(&up.is_some())?;
290 if let Some(arc) = up {
291 ts.serialize_field(&*arc)?;
292 } else {
293 ts.serialize_field(&())?;
294 }
295 ts.end()
296 }
297}
298
299impl<T: Serialize> Serialize for FlowSeq<T> {
301 fn serialize<S: Serializer>(&self, s: S) -> std::result::Result<S::Ok, S::Error> {
302 s.serialize_newtype_struct(NAME_FLOW_SEQ, &self.0)
303 }
304}
305impl<T: Serialize> Serialize for FlowMap<T> {
306 fn serialize<S: Serializer>(&self, s: S) -> std::result::Result<S::Ok, S::Error> {
307 s.serialize_newtype_struct(NAME_FLOW_MAP, &self.0)
308 }
309}
310
311impl<T: Serialize> Serialize for Commented<T> {
312 fn serialize<S: Serializer>(&self, s: S) -> std::result::Result<S::Ok, S::Error> {
313 let mut ts = s.serialize_tuple_struct(NAME_TUPLE_COMMENTED, 2)?;
316 ts.serialize_field(&self.1)?; ts.serialize_field(&self.0)?; ts.end()
319 }
320}
321
322impl<'de, T: Deserialize<'de>> Deserialize<'de> for FlowSeq<T> {
324 fn deserialize<D: Deserializer<'de>>(deserializer: D) -> std::result::Result<Self, D::Error> {
325 T::deserialize(deserializer).map(FlowSeq)
326 }
327}
328impl<'de, T: Deserialize<'de>> Deserialize<'de> for FlowMap<T> {
329 fn deserialize<D: Deserializer<'de>>(deserializer: D) -> std::result::Result<Self, D::Error> {
330 T::deserialize(deserializer).map(FlowMap)
331 }
332}
333impl<'de, T: Deserialize<'de>> Deserialize<'de> for Commented<T> {
334 fn deserialize<D: Deserializer<'de>>(deserializer: D) -> std::result::Result<Self, D::Error> {
335 T::deserialize(deserializer).map(|v| Commented(v, String::new()))
336 }
337}
338
339impl<'a> Serialize for LitStr<'a> {
340 fn serialize<S: Serializer>(&self, s: S) -> std::result::Result<S::Ok, S::Error> {
341 s.serialize_newtype_struct(NAME_LIT_STR, &self.0)
343 }
344}
345impl Serialize for LitString {
346 fn serialize<S: Serializer>(&self, s: S) -> std::result::Result<S::Ok, S::Error> {
347 s.serialize_newtype_struct(NAME_LIT_STR, &self.0)
348 }
349}
350impl<'a> Serialize for FoldStr<'a> {
351 fn serialize<S: Serializer>(&self, s: S) -> std::result::Result<S::Ok, S::Error> {
352 s.serialize_newtype_struct(NAME_FOLD_STR, &self.0)
353 }
354}
355impl Serialize for FoldString {
356 fn serialize<S: Serializer>(&self, s: S) -> std::result::Result<S::Ok, S::Error> {
357 s.serialize_newtype_struct(NAME_FOLD_STR, &self.0)
358 }
359}
360
361impl<'de> Deserialize<'de> for LitString {
363 fn deserialize<D: Deserializer<'de>>(deserializer: D) -> std::result::Result<Self, D::Error> {
364 String::deserialize(deserializer).map(LitString)
365 }
366}
367impl<'de> Deserialize<'de> for FoldString {
368 fn deserialize<D: Deserializer<'de>>(deserializer: D) -> std::result::Result<Self, D::Error> {
369 String::deserialize(deserializer).map(FoldString)
370 }
371}
372
373#[derive(Clone, Copy, PartialEq, Eq)]
378enum PendingFlow {
379 AnySeq,
380 AnyMap,
381}
382#[derive(Clone, Copy, PartialEq, Eq)]
383enum StrStyle {
384 Literal, Folded, }
387
388type AnchorId = u32;
390
391pub struct YamlSer<'a, W: Write> {
396 out: &'a mut W,
398 indent_step: usize,
400 min_fold_chars: usize,
402 folded_wrap_col: usize,
404 depth: usize,
406 at_line_start: bool,
408
409 anchors: HashMap<usize, AnchorId, BuildNoHashHasher<usize>>,
412 next_anchor_id: AnchorId,
414 pending_anchor_id: Option<AnchorId>,
416 anchor_gen: Option<fn(usize) -> String>,
418 custom_anchor_names: Option<Vec<String>>,
420
421 pending_flow: Option<PendingFlow>,
424 in_flow: usize,
426 pending_str_style: Option<StrStyle>,
428 pending_str_from_auto: bool,
431 pending_inline_comment: Option<String>,
433 tagged_enums: bool,
435 empty_as_braces: bool,
437 prefer_block_scalars: bool,
441 pending_inline_map: bool,
444 pending_space_after_colon: bool,
447 inline_map_after_dash: bool,
450 after_dash_depth: Option<usize>,
453 current_map_depth: Option<usize>,
455}
456
457impl<'a, W: Write> YamlSer<'a, W> {
458 pub fn new(out: &'a mut W) -> Self {
461 Self {
462 out,
463 indent_step: 2,
464 min_fold_chars: MIN_FOLD_CHARS,
465 folded_wrap_col: FOLDED_WRAP_CHARS,
466 depth: 0,
467 at_line_start: true,
468 anchors: HashMap::with_hasher(BuildNoHashHasher::default()),
469 next_anchor_id: 1,
470 pending_anchor_id: None,
471 anchor_gen: None,
472 custom_anchor_names: None,
473 pending_flow: None,
474 in_flow: 0,
475 pending_str_style: None,
476 pending_inline_comment: None,
477 tagged_enums: false,
478 empty_as_braces: true,
479 prefer_block_scalars: true,
480 pending_inline_map: false,
481 pending_space_after_colon: false,
482 inline_map_after_dash: false,
483 after_dash_depth: None,
484 current_map_depth: None,
485 pending_str_from_auto: false,
486 }
487 }
488 pub fn with_indent(out: &'a mut W, indent_step: usize) -> Self {
491 let mut s = Self::new(out);
492 s.indent_step = indent_step;
493 s
494 }
495 pub fn with_options(out: &'a mut W, options: &mut SerializerOptions) -> Self {
498 let mut s = Self::new(out);
499 s.indent_step = options.indent_step;
500 s.min_fold_chars = options.min_fold_chars;
501 s.folded_wrap_col = options.folded_wrap_chars;
502 s.anchor_gen = options.anchor_generator.take();
503 s.tagged_enums = options.tagged_enums;
504 s.empty_as_braces = options.empty_as_braces;
505 s.prefer_block_scalars = options.prefer_block_scalars;
506 s
507 }
508
509 #[inline]
514 fn write_end_of_scalar(&mut self) -> Result<()> {
515 if self.in_flow == 0 {
516 if let Some(c) = self.pending_inline_comment.take() {
517 self.out.write_str(" # ")?;
518 self.out.write_str(&c)?;
519 }
520 self.newline()?;
521 }
522 Ok(())
523 }
524
525 #[inline]
528 fn alloc_anchor_for(&mut self, ptr: usize) -> (AnchorId, bool) {
529 match self.anchors.entry(ptr) {
530 std::collections::hash_map::Entry::Occupied(e) => (*e.get(), false),
531 std::collections::hash_map::Entry::Vacant(v) => {
532 let id = self.next_anchor_id;
533 self.next_anchor_id = self.next_anchor_id.saturating_add(1);
534 if let Some(generator) = self.anchor_gen {
535 let name = generator(id as usize);
536 self.custom_anchor_names
537 .get_or_insert_with(Vec::new)
538 .push(name);
539 }
540 v.insert(id);
541 (id, true)
542 }
543 }
544 }
545
546 #[inline]
548 fn write_anchor_name(&mut self, id: AnchorId) -> Result<()> {
549 if let Some(names) = &self.custom_anchor_names {
550 let idx = id as usize - 1;
552 if let Some(name) = names.get(idx) {
553 self.out.write_str(name)?;
554 } else {
555 write!(self.out, "a{}", id)?;
557 }
558 } else {
559 write!(self.out, "a{}", id)?;
560 }
561 Ok(())
562 }
563
564 #[inline]
567 fn write_space_if_pending(&mut self) -> Result<()> {
568 if self.pending_space_after_colon {
569 self.out.write_char(' ')?;
570 self.pending_space_after_colon = false;
571 }
572 Ok(())
573 }
574
575 #[inline]
578 fn write_indent(&mut self, depth: usize) -> Result<()> {
579 if self.at_line_start {
580 for _k in 0..self.indent_step * depth {
581 self.out.write_char(' ')?;
582 }
583 self.at_line_start = false;
584 }
585 Ok(())
586 }
587
588 #[inline]
591 fn newline(&mut self) -> Result<()> {
592 self.out.write_char('\n')?;
593 self.at_line_start = true;
594 Ok(())
595 }
596
597 fn write_folded_block(&mut self, s: &str, indent: usize) -> Result<()> {
602 let mut indent_buf: String = String::new();
604 let spaces = self.indent_step * indent;
605 if spaces > 0 {
606 indent_buf.reserve(spaces);
607 for _ in 0..spaces {
608 indent_buf.push(' ');
609 }
610 }
611 let indent_str = indent_buf.as_str();
612
613 for line in s.split('\n') {
614 if line.is_empty() {
615 self.out.write_str(indent_str)?;
617 self.at_line_start = false;
618 self.newline()?;
619 continue;
620 }
621 let mut start = 0; let mut last_space_byte: Option<usize> = None;
623 let mut col = 0usize; for (i, ch) in line.char_indices() {
625 if ch.is_whitespace() {
627 last_space_byte = Some(i);
628 }
629 col += 1;
630 if col > self.folded_wrap_col {
631 let break_at = last_space_byte.unwrap_or(i);
632 self.out.write_str(indent_str)?;
634 self.at_line_start = false;
635 let slice = &line[start..break_at];
637 self.out.write_str(slice)?;
638 self.newline()?;
639 start = if let Some(sp) = last_space_byte { sp + 1 } else { break_at };
641 last_space_byte = None;
646 col = 0;
647 }
648 }
649 if start < line.len() {
651 self.out.write_str(indent_str)?;
652 self.at_line_start = false;
653 self.out.write_str(&line[start..])?;
654 self.newline()?;
655 } else {
656 self.out.write_str(indent_str)?;
658 self.at_line_start = false;
659 self.newline()?;
660 }
661 }
662 Ok(())
663 }
664
665 fn write_plain_or_quoted(&mut self, s: &str) -> Result<()> {
668 if is_plain_safe(s) {
669 self.out.write_str(s)?;
670 Ok(())
671 } else {
672 self.write_quoted(s)
673 }
674 }
675
676 fn write_quoted(&mut self, s: &str) -> Result<()> {
678 self.out.write_char('"')?;
679 for ch in s.chars() {
680 match ch {
681 '\\' => self.out.write_str("\\\\")?,
682 '"' => self.out.write_str("\\\"")?,
683 '\0' => self.out.write_str("\\0")?,
685 '\u{7}' => self.out.write_str("\\a")?,
686 '\u{8}' => self.out.write_str("\\b")?,
687 '\t' => self.out.write_str("\\t")?,
688 '\n' => self.out.write_str("\\n")?,
689 '\u{b}' => self.out.write_str("\\v")?,
690 '\u{c}' => self.out.write_str("\\f")?,
691 '\r' => self.out.write_str("\\r")?,
692 '\u{1b}' => self.out.write_str("\\e")?,
693 '\u{FEFF}' => self.out.write_str("\\uFEFF")?,
695 '\u{0085}' => self.out.write_str("\\N")?,
697 '\u{2028}' => self.out.write_str("\\L")?,
698 '\u{2029}' => self.out.write_str("\\P")?,
699 c if (c as u32) <= 0xFF
700 && (c.is_control() || (0x7F..=0x9F).contains(&(c as u32))) =>
701 {
702 write!(self.out, "\\x{:02X}", c as u32)?
703 }
704 c if (c as u32) <= 0xFFFF
705 && (c.is_control() || (0x7F..=0x9F).contains(&(c as u32))) =>
706 {
707 write!(self.out, "\\u{:04X}", c as u32)?
708 }
709 c => self.out.write_char(c)?,
710 }
711 }
712 self.out.write_char('"')?;
713 Ok(())
714 }
715
716 #[inline]
718 fn write_plain_or_quoted_value(&mut self, s: &str) -> Result<()> {
719 if is_plain_value_safe(s) {
720 self.out.write_str(s)?;
721 Ok(())
722 } else {
723 self.write_quoted(s)
725 }
726 }
727
728 fn serialize_tagged_scalar(&mut self, enum_name: &str, variant: &str) -> Result<()> {
731 self.write_scalar_prefix_if_anchor()?;
732 if self.at_line_start {
733 self.write_indent(self.depth)?;
734 }
735 self.out.write_str("!!")?;
736 self.out.write_str(enum_name)?;
737 self.out.write_char(' ')?;
738 self.write_plain_or_quoted_value(variant)?;
739 self.write_end_of_scalar()
740 }
741
742 #[inline]
745 fn write_scalar_prefix_if_anchor(&mut self) -> Result<()> {
746 if let Some(id) = self.pending_anchor_id.take() {
747 if self.at_line_start {
748 self.write_indent(self.depth)?;
749 }
750 self.out.write_char('&')?;
751 self.write_anchor_name(id)?;
752 self.out.write_char(' ')?;
753 }
754 Ok(())
755 }
756
757 #[inline]
760 fn write_anchor_for_complex_node(&mut self) -> Result<()> {
761 if let Some(id) = self.pending_anchor_id.take() {
762 if self.at_line_start {
763 self.write_indent(self.depth)?;
764 }
765 self.write_space_if_pending()?;
766 self.out.write_char('&')?;
767 self.write_anchor_name(id)?;
768 self.newline()?;
769 }
770 Ok(())
771 }
772
773 #[inline]
776 fn write_alias_id(&mut self, id: AnchorId) -> Result<()> {
777 if self.at_line_start {
778 self.write_indent(self.depth)?;
779 }
780 self.write_space_if_pending()?;
781 self.out.write_char('*')?;
782 self.write_anchor_name(id)?;
783 self.write_end_of_scalar()?;
785 Ok(())
786 }
787
788 #[inline]
791 fn take_flow_for_seq(&mut self) -> bool {
792 if self.in_flow > 0 {
793 true
794 } else {
795 matches!(self.pending_flow.take(), Some(PendingFlow::AnySeq))
796 }
797 }
798 #[inline]
801 fn take_flow_for_map(&mut self) -> bool {
802 if self.in_flow > 0 {
803 true
804 } else {
805 matches!(self.pending_flow.take(), Some(PendingFlow::AnyMap))
806 }
807 }
808
809 #[inline]
812 fn with_in_flow<T>(&mut self, f: impl FnOnce(&mut Self) -> Result<T>) -> Result<T> {
813 self.in_flow += 1;
814 let r = f(self);
815 self.in_flow -= 1;
816 r
817 }
818}
819
820impl<'a, 'b, W: Write> Serializer for &'a mut YamlSer<'b, W> {
825 type Ok = ();
826 type Error = Error;
827
828 type SerializeSeq = SeqSer<'a, 'b, W>;
829 type SerializeTuple = SeqSer<'a, 'b, W>;
830 type SerializeTupleStruct = TupleSer<'a, 'b, W>;
831 type SerializeTupleVariant = TupleVariantSer<'a, 'b, W>;
832 type SerializeMap = MapSer<'a, 'b, W>;
833 type SerializeStruct = MapSer<'a, 'b, W>;
834 type SerializeStructVariant = StructVariantSer<'a, 'b, W>;
835
836 fn serialize_bool(self, v: bool) -> Result<()> {
839 self.write_space_if_pending()?;
840 self.write_scalar_prefix_if_anchor()?;
841 if self.at_line_start {
842 self.write_indent(self.depth)?;
843 }
844 self.out.write_str(if v { "true" } else { "false" })?;
845 self.write_end_of_scalar()?;
846 Ok(())
847 }
848
849 fn serialize_i8(self, v: i8) -> Result<()> {
850 self.serialize_i64(v as i64)
851 }
852 fn serialize_i16(self, v: i16) -> Result<()> {
853 self.serialize_i64(v as i64)
854 }
855 fn serialize_i32(self, v: i32) -> Result<()> {
856 self.serialize_i64(v as i64)
857 }
858 fn serialize_i64(self, v: i64) -> Result<()> {
859 self.write_space_if_pending()?;
860 self.write_scalar_prefix_if_anchor()?;
861 if self.at_line_start {
862 self.write_indent(self.depth)?;
863 }
864 write!(self.out, "{}", v)?;
865 self.write_end_of_scalar()?;
866 Ok(())
867 }
868
869 fn serialize_i128(self, v: i128) -> Result<()> {
870 self.write_space_if_pending()?;
871 self.write_scalar_prefix_if_anchor()?;
872 if self.at_line_start {
873 self.write_indent(self.depth)?;
874 }
875 write!(self.out, "{}", v)?;
876 self.write_end_of_scalar()?;
877 Ok(())
878 }
879
880 fn serialize_u8(self, v: u8) -> Result<()> {
881 self.serialize_u64(v as u64)
882 }
883 fn serialize_u16(self, v: u16) -> Result<()> {
884 self.serialize_u64(v as u64)
885 }
886 fn serialize_u32(self, v: u32) -> Result<()> {
887 self.serialize_u64(v as u64)
888 }
889 fn serialize_u64(self, v: u64) -> Result<()> {
890 self.write_space_if_pending()?;
891 self.write_scalar_prefix_if_anchor()?;
892 if self.at_line_start {
893 self.write_indent(self.depth)?;
894 }
895 write!(self.out, "{}", v)?;
896 self.write_end_of_scalar()?;
897 Ok(())
898 }
899
900 fn serialize_u128(self, v: u128) -> Result<()> {
901 self.write_space_if_pending()?;
902 self.write_scalar_prefix_if_anchor()?;
903 if self.at_line_start {
904 self.write_indent(self.depth)?;
905 }
906 write!(self.out, "{}", v)?;
907 self.write_end_of_scalar()?;
908 Ok(())
909 }
910
911 fn serialize_f32(self, v: f32) -> Result<()> {
912 self.serialize_f64(v as f64)
913 }
914 fn serialize_f64(self, v: f64) -> Result<()> {
915 self.write_space_if_pending()?;
916 self.write_scalar_prefix_if_anchor()?;
917 if self.at_line_start {
918 self.write_indent(self.depth)?;
919 }
920 if v.is_nan() {
921 self.out.write_str(".nan")?;
922 } else if v.is_infinite() {
923 if v.is_sign_positive() {
924 self.out.write_str(".inf")?;
925 } else {
926 self.out.write_str("-.inf")?;
927 }
928 } else {
929 let mut buf = ryu::Buffer::new();
930 let s = buf.format(v);
931 if !s.contains('.') && !s.contains('e') && !s.contains('E') {
932 self.out.write_str(s)?;
933 self.out.write_str(".0")?;
934 } else {
935 self.out.write_str(s)?;
936 }
937 }
938 self.write_end_of_scalar()?;
939 Ok(())
940 }
941
942 fn serialize_char(self, v: char) -> Result<()> {
943 self.write_space_if_pending()?;
944 let mut buf = [0u8; 4];
945 self.serialize_str(v.encode_utf8(&mut buf))
946 }
947
948 fn serialize_str(self, v: &str) -> Result<()> {
949 if self.pending_str_style.is_none() && self.prefer_block_scalars && self.in_flow == 0 {
956 use crate::ser_quoting::is_plain_value_safe;
957
958 if v.contains('\n') {
959 let trimmed = v.trim_end_matches('\n');
963 let normalized = trimmed.replace('\n', " ");
964 if is_plain_value_safe(&normalized) {
965 self.pending_str_style = Some(StrStyle::Literal);
966 self.pending_str_from_auto = true;
967 }
968 } else {
969 let needs_quoting = !is_plain_value_safe(v);
971 if !needs_quoting {
972 if v.len() > self.folded_wrap_col {
974 self.pending_str_style = Some(StrStyle::Folded);
975 self.pending_str_from_auto = true;
976 }
977 }
978 }
979 }
980 if let Some(style) = self.pending_str_style.take() {
981 self.write_space_if_pending()?;
984 let base = if let Some(d) = self.after_dash_depth {
987 d
988 } else {
989 self.current_map_depth.unwrap_or(self.depth)
990 };
991 if self.at_line_start {
992 self.write_indent(base)?;
993 }
994 match style {
995 StrStyle::Literal => {
996 let content = v.trim_end_matches('\n');
1001 let trailing_nl = v.len() - content.len();
1002 match trailing_nl {
1003 0 => self.out.write_str("|-")?,
1004 1 => self.out.write_str("|")?,
1005 _ => self.out.write_str("|+")?,
1006 }
1007 self.newline()?;
1008
1009 let body_base = base + 1;
1018 let mut indent_buf: String = String::new();
1020 let spaces = self.indent_step * body_base;
1021 if spaces > 0 {
1022 indent_buf.reserve(spaces);
1023 for _ in 0..spaces { indent_buf.push(' '); }
1024 }
1025 let indent_str = indent_buf.as_str();
1026
1027 if content.is_empty() {
1028 if trailing_nl >= 1 {
1029 self.out.write_str(indent_str)?;
1030 self.at_line_start = false;
1031 self.newline()?;
1033 }
1034 } else {
1035 for line in content.split('\n') {
1036 self.out.write_str(indent_str)?;
1037 self.at_line_start = false;
1038 self.out.write_str(line)?;
1039 self.newline()?;
1040 }
1041 if trailing_nl >= 2 {
1042 for _ in 0..(trailing_nl - 1) {
1043 self.out.write_str(indent_str)?;
1044 self.at_line_start = false;
1045 self.newline()?;
1046 }
1047 }
1048 }
1049 }
1050 StrStyle::Folded => {
1051 if self.pending_str_from_auto {
1052 let content = v.trim_end_matches('\n');
1055 let trailing_nl = v.len() - content.len();
1056 match trailing_nl {
1057 0 => self.out.write_str(">-")?,
1058 1 => self.out.write_str(">")?,
1059 _ => self.out.write_str(">+")?,
1060 }
1061 } else {
1062 self.out.write_str(">")?;
1065 }
1066 self.newline()?;
1067 let body_base = base + 1;
1069 self.write_folded_block(v, body_base)?;
1070 }
1071 }
1072 self.pending_str_from_auto = false;
1074 return Ok(());
1075 }
1076 self.write_space_if_pending()?;
1077 self.write_scalar_prefix_if_anchor()?;
1078 if self.at_line_start {
1079 self.write_indent(self.depth)?;
1080 }
1081 if v.len() == 1 {
1084 if let Some(ch) = v.chars().next() {
1085 if ch == '.' || ch == '#' || ch == '-' {
1086 self.out.write_char('\'')?;
1087 self.out.write_char(ch)?;
1088 self.out.write_char('\'')?;
1089 self.write_end_of_scalar()?;
1090 return Ok(());
1091 }
1092 }
1093 }
1094 self.write_plain_or_quoted_value(v)?;
1095 self.write_end_of_scalar()?;
1096 Ok(())
1097 }
1098
1099 fn serialize_bytes(self, v: &[u8]) -> Result<()> {
1100 if self.at_line_start {
1107 let mut seq = self.serialize_seq(Some(v.len()))?;
1109 for b in v {
1110 serde::ser::SerializeSeq::serialize_element(&mut seq, b)?;
1111 }
1112 return serde::ser::SerializeSeq::end(seq);
1113 }
1114
1115 self.write_space_if_pending()?;
1117 self.write_scalar_prefix_if_anchor()?;
1118 self.out.write_str("!!binary ")?;
1120 let mut s = String::new();
1121 B64.encode_string(v, &mut s);
1122 self.out.write_str(&s)?;
1123 self.write_end_of_scalar()?;
1124 Ok(())
1125 }
1126
1127 fn serialize_none(self) -> Result<()> {
1128 self.write_space_if_pending()?;
1129 if self.at_line_start {
1130 self.write_indent(self.depth)?;
1131 }
1132 self.out.write_str("null")?;
1133 self.write_end_of_scalar()?;
1134 Ok(())
1135 }
1136
1137 fn serialize_some<T: ?Sized + Serialize>(self, value: &T) -> Result<()> {
1138 value.serialize(self)
1139 }
1140
1141 fn serialize_unit(self) -> Result<()> {
1142 self.write_space_if_pending()?;
1143 if self.at_line_start {
1144 self.write_indent(self.depth)?;
1145 }
1146 self.out.write_str("null")?;
1147 self.write_end_of_scalar()?;
1148 Ok(())
1149 }
1150
1151 fn serialize_unit_struct(self, _name: &'static str) -> Result<()> {
1152 self.serialize_unit()
1153 }
1154
1155 fn serialize_unit_variant(
1156 self,
1157 name: &'static str,
1158 _variant_index: u32,
1159 variant: &'static str,
1160 ) -> Result<()> {
1161 self.write_space_if_pending()?;
1163 if self.tagged_enums {
1164 self.serialize_tagged_scalar(name, variant)
1165 } else {
1166 self.serialize_str(variant)
1167 }
1168 }
1169
1170 fn serialize_newtype_struct<T: ?Sized + Serialize>(
1171 self,
1172 name: &'static str,
1173 value: &T,
1174 ) -> Result<()> {
1175 match name {
1177 NAME_FLOW_SEQ => {
1178 self.pending_flow = Some(PendingFlow::AnySeq);
1179 return value.serialize(self);
1180 }
1181 NAME_FLOW_MAP => {
1182 self.pending_flow = Some(PendingFlow::AnyMap);
1183 return value.serialize(self);
1184 }
1185 NAME_LIT_STR => {
1186 let mut cap = StrCapture::default();
1190 value.serialize(&mut cap)?;
1191 let s = cap.finish()?;
1192 self.pending_str_style = Some(StrStyle::Literal);
1193 return self.serialize_str(&s);
1194 }
1195 NAME_FOLD_STR => {
1196 let mut cap = StrCapture::default();
1197 value.serialize(&mut cap)?;
1198 let s = cap.finish()?;
1199 let is_multiline = s.contains('\n');
1200 if !is_multiline && s.len() < self.min_fold_chars {
1201 return self.serialize_str(&s);
1202 }
1203 self.pending_str_style = Some(StrStyle::Folded);
1204 return self.serialize_str(&s);
1205 }
1206 _ => {}
1207 }
1208 value.serialize(self)
1210 }
1211
1212 fn serialize_newtype_variant<T: ?Sized + Serialize>(
1213 self,
1214 _name: &'static str,
1215 _variant_index: u32,
1216 variant: &'static str,
1217 value: &T,
1218 ) -> Result<()> {
1219 if self.pending_space_after_colon {
1224 self.pending_space_after_colon = false;
1226 self.newline()?;
1227 let base = self.current_map_depth.unwrap_or(self.depth);
1230 self.write_indent(base + 1)?;
1231 self.write_plain_or_quoted(variant)?;
1232 self.out.write_str(":")?;
1235 self.pending_space_after_colon = true;
1236 self.at_line_start = false;
1237 let prev_map_depth = self.current_map_depth.replace(base + 1);
1240 let res = value.serialize(&mut *self);
1241 self.current_map_depth = prev_map_depth;
1242 return res;
1243 }
1244 if self.at_line_start {
1246 self.write_indent(self.depth)?;
1247 }
1248 self.write_plain_or_quoted(variant)?;
1249 self.out.write_str(":")?;
1251 self.pending_space_after_colon = true;
1252 self.at_line_start = false;
1253 value.serialize(&mut *self)
1254 }
1255
1256 fn serialize_seq(self, _len: Option<usize>) -> Result<Self::SerializeSeq> {
1259 let flow = self.take_flow_for_seq();
1260 if flow {
1261 self.write_scalar_prefix_if_anchor()?;
1262 self.write_space_if_pending()?;
1264 if self.at_line_start {
1265 self.write_indent(self.depth)?;
1266 }
1267 self.out.write_str("[")?;
1268 self.at_line_start = false;
1269 let depth_next = self.depth; Ok(SeqSer {
1271 ser: self,
1272 depth: depth_next,
1273 flow: true,
1274 first: true,
1275 })
1276 } else {
1277 let was_inline_value = !self.at_line_start;
1279
1280 let inline_first = (!self.at_line_start)
1287 && self.after_dash_depth.is_some()
1288 && !self.pending_space_after_colon;
1289 self.write_anchor_for_complex_node()?;
1292 if inline_first {
1293 self.at_line_start = false;
1296 } else if was_inline_value {
1297 }
1302 let base = if inline_first {
1307 self.after_dash_depth.unwrap_or(self.depth)
1308 } else if was_inline_value && self.current_map_depth.is_some() {
1309 self.current_map_depth.unwrap_or(self.depth)
1311 } else {
1312 self.depth
1313 };
1314 let depth_next = if inline_first || was_inline_value {
1318 base + 1
1319 } else {
1320 base
1321 };
1322 self.pending_inline_comment = None;
1324 Ok(SeqSer {
1325 ser: self,
1326 depth: depth_next,
1327 flow: false,
1328 first: true,
1329 })
1330 }
1331 }
1332
1333 fn serialize_tuple(self, len: usize) -> Result<Self::SerializeTuple> {
1334 self.serialize_seq(Some(len))
1335 }
1336
1337 fn serialize_tuple_struct(
1338 self,
1339 name: &'static str,
1340 _len: usize,
1341 ) -> Result<Self::SerializeTupleStruct> {
1342 if name == NAME_TUPLE_ANCHOR {
1343 Ok(TupleSer::anchor_strong(self))
1344 } else if name == NAME_TUPLE_WEAK {
1345 Ok(TupleSer::anchor_weak(self))
1346 } else if name == NAME_TUPLE_COMMENTED {
1347 Ok(TupleSer::commented(self))
1348 } else {
1349 Ok(TupleSer::normal(self))
1351 }
1352 }
1353
1354 fn serialize_tuple_variant(
1355 self,
1356 _name: &'static str,
1357 _variant_index: u32,
1358 variant: &'static str,
1359 _len: usize,
1360 ) -> Result<Self::SerializeTupleVariant> {
1361 if self.at_line_start {
1362 self.write_indent(self.depth)?;
1363 }
1364 self.write_plain_or_quoted(variant)?;
1365 self.out.write_str(":\n")?;
1366 self.at_line_start = true;
1367 let depth_next = self.depth + 1;
1368 Ok(TupleVariantSer {
1369 ser: self,
1370 depth: depth_next,
1371 })
1372 }
1373
1374 fn serialize_map(self, _len: Option<usize>) -> Result<Self::SerializeMap> {
1375 let flow = self.take_flow_for_map();
1376 if flow {
1377 self.write_scalar_prefix_if_anchor()?;
1378 self.write_space_if_pending()?;
1380 if self.at_line_start {
1381 self.write_indent(self.depth)?;
1382 }
1383 self.out.write_str("{")?;
1384 self.at_line_start = false;
1385 let depth_next = self.depth;
1386 Ok(MapSer {
1387 ser: self,
1388 depth: depth_next,
1389 flow: true,
1390 first: true,
1391 last_key_complex: false,
1392 align_after_dash: false,
1393 inline_value_start: false,
1394 })
1395 } else {
1396 let inline_first = self.pending_inline_map;
1397 let was_inline_value = self.pending_space_after_colon;
1399 self.write_anchor_for_complex_node()?;
1400 if inline_first {
1401 self.pending_inline_map = false;
1403 self.inline_map_after_dash = true;
1405 } else if self.pending_space_after_colon {
1406 if !self.empty_as_braces {
1409 self.pending_space_after_colon = false;
1412 if !self.at_line_start {
1413 self.newline()?;
1414 }
1415 }
1416 }
1417 let base = if inline_first {
1424 self.after_dash_depth.unwrap_or(self.depth)
1425 } else if was_inline_value && self.current_map_depth.is_some() {
1426 self.current_map_depth.unwrap_or(self.depth)
1427 } else {
1428 self.depth
1429 };
1430 let depth_next = if inline_first || was_inline_value {
1431 base + 1
1432 } else {
1433 base
1434 };
1435 let inline_value_start_flag = was_inline_value && self.empty_as_braces &&
1436 !inline_first;
1437 Ok(MapSer {
1438 ser: self,
1439 depth: depth_next,
1440 flow: false,
1441 first: true,
1442 last_key_complex: false,
1443 align_after_dash: inline_first,
1444 inline_value_start: inline_value_start_flag,
1445 })
1446 }
1447 }
1448
1449 fn serialize_struct(self, _name: &'static str, _len: usize) -> Result<Self::SerializeStruct> {
1450 self.serialize_map(None)
1451 }
1452
1453 fn serialize_struct_variant(
1454 self,
1455 _name: &'static str,
1456 _variant_index: u32,
1457 variant: &'static str,
1458 _len: usize,
1459 ) -> Result<Self::SerializeStructVariant> {
1460 let _was_inline_value = !self.at_line_start;
1464 if self.pending_space_after_colon {
1465 self.pending_space_after_colon = false;
1467 self.newline()?;
1468 let base = self.current_map_depth.unwrap_or(self.depth) + 1;
1470 self.write_indent(base)?;
1471 self.write_plain_or_quoted(variant)?;
1472 self.out.write_str(":\n")?;
1473 self.at_line_start = true;
1474 let depth_next = base + 1;
1476 return Ok(StructVariantSer {
1477 ser: self,
1478 depth: depth_next,
1479 });
1480 }
1481 if self.at_line_start {
1483 self.write_indent(self.depth)?;
1484 }
1485 self.write_plain_or_quoted(variant)?;
1486 self.out.write_str(":\n")?;
1487 self.at_line_start = true;
1488 let mut depth_next = self.depth + 1;
1490 if let Some(d) = self.after_dash_depth.take() {
1492 depth_next = d + 2;
1493 self.pending_inline_map = false;
1494 }
1495 Ok(StructVariantSer {
1496 ser: self,
1497 depth: depth_next,
1498 })
1499 }
1500}
1501
1502pub struct SeqSer<'a, 'b, W: Write> {
1511 ser: &'a mut YamlSer<'b, W>,
1513 depth: usize,
1515 flow: bool,
1517 first: bool,
1519}
1520
1521impl<'a, 'b, W: Write> SerializeTuple for SeqSer<'a, 'b, W> {
1522 type Ok = ();
1523 type Error = Error;
1524
1525 fn serialize_element<T: ?Sized + Serialize>(&mut self, v: &T) -> Result<()> {
1526 SerializeSeq::serialize_element(self, v)
1527 }
1528 fn end(self) -> Result<()> {
1529 SerializeSeq::end(self)
1530 }
1531}
1532
1533impl<'a, 'b, W: Write> SerializeSeq for SeqSer<'a, 'b, W> {
1535 type Ok = ();
1536 type Error = Error;
1537
1538 fn serialize_element<T: ?Sized + Serialize>(&mut self, v: &T) -> Result<()> {
1539 if self.flow {
1540 if !self.first {
1541 self.ser.out.write_str(", ")?;
1542 }
1543 self.ser.with_in_flow(|s| v.serialize(s))?;
1544 } else {
1545 if self.first && self.ser.pending_space_after_colon {
1548 self.ser.pending_space_after_colon = false;
1549 if !self.ser.at_line_start {
1550 self.ser.newline()?;
1551 }
1552 }
1553 if !self.first && self.ser.inline_map_after_dash {
1555 self.ser.inline_map_after_dash = false;
1556 }
1557 if self.first && (!self.ser.at_line_start || self.ser.pending_inline_map) {
1558 } else {
1562 self.ser.write_indent(self.depth)?;
1563 }
1564 self.ser.out.write_str("- ")?;
1565 self.ser.at_line_start = false;
1566 if self.first && self.ser.inline_map_after_dash {
1567 self.ser.inline_map_after_dash = false;
1569 }
1570 self.ser.after_dash_depth = Some(self.depth);
1572 self.ser.pending_inline_map = true;
1574 v.serialize(&mut *self.ser)?;
1575 }
1576 self.first = false;
1577 Ok(())
1578 }
1579
1580 fn end(self) -> Result<()> {
1581 if self.flow {
1582 let me = self;
1583 me.ser.out.write_str("]")?;
1584 if me.ser.in_flow == 0 {
1585 me.ser.newline()?;
1586 }
1587 } else if self.first {
1588 if self.ser.empty_as_braces {
1590 if self.ser.pending_space_after_colon {
1592 self.ser.out.write_str(" ")?;
1593 self.ser.pending_space_after_colon = false;
1594 }
1595 if self.ser.at_line_start {
1597 self.ser.write_indent(self.depth)?;
1598 }
1599 self.ser.out.write_str("[]")?;
1600 self.ser.newline()?;
1601 } else {
1602 self.ser.newline()?;
1604 }
1605 }
1606 Ok(())
1607 }
1608}
1609
1610pub struct TupleSer<'a, 'b, W: Write> {
1618 ser: &'a mut YamlSer<'b, W>,
1620 kind: TupleKind,
1622 idx: usize,
1624 depth_for_normal: usize,
1627
1628 strong_alias_id: Option<AnchorId>,
1631 weak_present: bool,
1633 skip_third: bool,
1635 weak_alias_id: Option<AnchorId>,
1637 comment_text: Option<String>,
1639}
1640enum TupleKind {
1641 Normal, AnchorStrong, AnchorWeak, Commented, }
1646impl<'a, 'b, W: Write> TupleSer<'a, 'b, W> {
1647 fn normal(ser: &'a mut YamlSer<'b, W>) -> Self {
1649 let depth_next = ser.depth + 1;
1650 Self {
1651 ser,
1652 kind: TupleKind::Normal,
1653 idx: 0,
1654 depth_for_normal: depth_next,
1655 strong_alias_id: None,
1656 weak_present: false,
1657 skip_third: false,
1658 weak_alias_id: None,
1659 comment_text: None,
1660 }
1661 }
1662 fn anchor_strong(ser: &'a mut YamlSer<'b, W>) -> Self {
1664 Self {
1665 ser,
1666 kind: TupleKind::AnchorStrong,
1667 idx: 0,
1668 depth_for_normal: 0,
1669 strong_alias_id: None,
1670 weak_present: false,
1671 skip_third: false,
1672 weak_alias_id: None,
1673 comment_text: None,
1674 }
1675 }
1676 fn anchor_weak(ser: &'a mut YamlSer<'b, W>) -> Self {
1678 Self {
1679 ser,
1680 kind: TupleKind::AnchorWeak,
1681 idx: 0,
1682 depth_for_normal: 0,
1683 strong_alias_id: None,
1684 weak_present: false,
1685 skip_third: false,
1686 weak_alias_id: None,
1687 comment_text: None,
1688 }
1689 }
1690 fn commented(ser: &'a mut YamlSer<'b, W>) -> Self {
1692 Self {
1693 ser,
1694 kind: TupleKind::Commented,
1695 idx: 0,
1696 depth_for_normal: 0,
1697 strong_alias_id: None,
1698 weak_present: false,
1699 skip_third: false,
1700 weak_alias_id: None,
1701 comment_text: None,
1702 }
1703 }
1704}
1705
1706impl<'a, 'b, W: Write> SerializeTupleStruct for TupleSer<'a, 'b, W> {
1707 type Ok = ();
1708 type Error = Error;
1709
1710 fn serialize_field<T: ?Sized + Serialize>(&mut self, value: &T) -> Result<()> {
1711 match self.kind {
1712 TupleKind::Normal => {
1713 if self.idx == 0 {
1714 self.ser.write_anchor_for_complex_node()?;
1715 if !self.ser.at_line_start {
1716 self.ser.newline()?;
1717 }
1718 }
1719 self.ser.write_indent(self.ser.depth + 1)?;
1720 self.ser.out.write_str("- ")?;
1721 self.ser.at_line_start = false;
1722 value.serialize(&mut *self.ser)?;
1723 }
1724 TupleKind::AnchorStrong => {
1725 match self.idx {
1726 0 => {
1727 let mut cap = UsizeCapture::default();
1729 value.serialize(&mut cap)?;
1730 let ptr = cap.finish()?;
1731 let (id, fresh) = self.ser.alloc_anchor_for(ptr);
1732 if fresh {
1733 self.ser.pending_anchor_id = Some(id); self.strong_alias_id = None;
1735 } else {
1736 self.strong_alias_id = Some(id); }
1738 }
1739 1 => {
1740 if let Some(id) = self.strong_alias_id.take() {
1741 self.ser.write_alias_id(id)?;
1743 } else {
1744 value.serialize(&mut *self.ser)?;
1746 }
1747 }
1748 _ => return Err(Error::unexpected("unexpected field in __yaml_anchor")),
1749 }
1750 }
1751 TupleKind::AnchorWeak => {
1752 match self.idx {
1753 0 => {
1754 let mut cap = UsizeCapture::default();
1755 value.serialize(&mut cap)?;
1756 let ptr = cap.finish()?;
1757 self.depth_for_normal = ptr; }
1759 1 => {
1760 let mut bc = BoolCapture::default();
1761 value.serialize(&mut bc)?;
1762 self.weak_present = bc.finish()?;
1763 if !self.weak_present {
1764 if self.ser.at_line_start {
1766 self.ser.write_indent(self.ser.depth)?;
1767 }
1768 self.ser.out.write_str("null")?;
1769 self.ser.write_end_of_scalar()?;
1771 self.skip_third = true;
1772 } else {
1773 let ptr = self.depth_for_normal;
1774 let (id, fresh) = self.ser.alloc_anchor_for(ptr);
1775 if fresh {
1776 self.ser.pending_anchor_id = Some(id); self.weak_alias_id = None;
1778 } else {
1779 self.weak_alias_id = Some(id); }
1781 }
1782 }
1783 2 => {
1784 if self.skip_third {
1785 } else if let Some(id) = self.weak_alias_id.take() {
1787 self.ser.write_alias_id(id)?;
1788 } else {
1789 value.serialize(&mut *self.ser)?;
1791 }
1792 }
1793 _ => return Err(Error::unexpected("unexpected field in __yaml_weak_anchor")),
1794 }
1795 }
1796 TupleKind::Commented => {
1797 match self.idx {
1798 0 => {
1799 let mut sc = StrCapture::default();
1801 value.serialize(&mut sc)?;
1802 self.comment_text = Some(sc.finish()?);
1803 }
1804 1 => {
1805 let comment = self.comment_text.take().unwrap_or_default();
1806 if self.ser.in_flow == 0 {
1807 if !comment.is_empty() {
1809 let sanitized = comment.replace('\n', " ");
1810 self.ser.pending_inline_comment = Some(sanitized);
1811 }
1812 value.serialize(&mut *self.ser)?;
1814 self.ser.pending_inline_comment = None;
1816 } else {
1817 value.serialize(&mut *self.ser)?;
1819 }
1820 }
1821 _ => return Err(Error::unexpected("unexpected field in __yaml_commented")),
1822 }
1823 }
1824 }
1825 self.idx += 1;
1826 Ok(())
1827 }
1828
1829 fn end(self) -> Result<()> {
1830 Ok(())
1831 }
1832}
1833
1834pub struct TupleVariantSer<'a, 'b, W: Write> {
1840 ser: &'a mut YamlSer<'b, W>,
1842 depth: usize,
1844}
1845impl<'a, 'b, W: Write> SerializeTupleVariant for TupleVariantSer<'a, 'b, W> {
1846 type Ok = ();
1847 type Error = Error;
1848
1849 fn serialize_field<T: ?Sized + Serialize>(&mut self, value: &T) -> Result<()> {
1850 self.ser.write_indent(self.depth)?;
1851 self.ser.out.write_str("- ")?;
1852 self.ser.at_line_start = false;
1853 value.serialize(&mut *self.ser)
1854 }
1855 fn end(self) -> Result<()> {
1856 Ok(())
1857 }
1858}
1859
1860pub struct MapSer<'a, 'b, W: Write> {
1869 ser: &'a mut YamlSer<'b, W>,
1871 depth: usize,
1873 flow: bool,
1875 first: bool,
1877 last_key_complex: bool,
1879 align_after_dash: bool,
1881 inline_value_start: bool,
1885}
1886
1887impl<'a, 'b, W: Write> SerializeMap for MapSer<'a, 'b, W> {
1888 type Ok = ();
1889 type Error = Error;
1890
1891 fn serialize_key<T: ?Sized + Serialize>(&mut self, key: &T) -> Result<()> {
1892 if self.flow {
1893 if !self.first {
1894 self.ser.out.write_str(", ")?;
1895 }
1896 let text = scalar_key_to_string(key)?;
1897 self.ser.out.write_str(&text)?;
1898 self.ser.out.write_str(": ")?;
1899 self.ser.at_line_start = false;
1900 self.last_key_complex = false;
1901 } else {
1902 match scalar_key_to_string(key) {
1903 Ok(text) => {
1904 if self.inline_value_start {
1907 if self.ser.pending_space_after_colon {
1909 self.ser.pending_space_after_colon = false;
1910 }
1911 if !self.ser.at_line_start {
1912 self.ser.newline()?;
1913 }
1914 self.inline_value_start = false;
1915 } else if !self.ser.at_line_start {
1916 self.ser.write_space_if_pending()?;
1917 }
1918 if self.align_after_dash && self.ser.at_line_start {
1921 let base = self.depth.saturating_sub(1);
1922 for _ in 0..self.ser.indent_step * base {
1923 self.ser.out.write_char(' ')?;
1924 }
1925 self.ser.out.write_str(" ")?; self.ser.at_line_start = false;
1927 } else {
1928 self.ser.write_indent(self.depth)?;
1929 }
1930 self.ser.out.write_str(&text)?;
1931 self.ser.out.write_str(":")?;
1933 self.ser.pending_space_after_colon = true;
1934 self.ser.at_line_start = false;
1935 self.last_key_complex = false;
1936 }
1937 Err(Error::Unexpected { msg }) if msg == "non-scalar key" => {
1938 if self.inline_value_start {
1940 if self.ser.pending_space_after_colon {
1941 self.ser.pending_space_after_colon = false;
1942 }
1943 if !self.ser.at_line_start {
1944 self.ser.newline()?;
1945 }
1946 self.inline_value_start = false;
1947 } else if !self.ser.at_line_start {
1948 self.ser.write_space_if_pending()?;
1949 }
1950 self.ser.write_anchor_for_complex_node()?;
1951 self.ser.write_indent(self.depth)?;
1952 self.ser.out.write_str("? ")?;
1953 self.ser.at_line_start = false;
1954
1955 let saved_depth = self.ser.depth;
1956 let saved_current_map_depth = self.ser.current_map_depth;
1957 let saved_pending_inline_map = self.ser.pending_inline_map;
1958 let saved_inline_map_after_dash = self.ser.inline_map_after_dash;
1959 let saved_after_dash_depth = self.ser.after_dash_depth;
1960
1961 self.ser.pending_inline_map = true;
1962 self.ser.depth = self.depth;
1963 self.ser.current_map_depth = Some(self.depth);
1966 self.ser.after_dash_depth = None;
1967 key.serialize(&mut *self.ser)?;
1968
1969 self.ser.depth = saved_depth;
1970 self.ser.current_map_depth = saved_current_map_depth;
1971 self.ser.pending_inline_map = saved_pending_inline_map;
1972 self.ser.inline_map_after_dash = saved_inline_map_after_dash;
1973 self.ser.after_dash_depth = saved_after_dash_depth;
1974 self.last_key_complex = true;
1975 }
1976 Err(e) => return Err(e),
1977 }
1978 }
1979 Ok(())
1980 }
1981
1982 fn serialize_value<T: ?Sized + Serialize>(&mut self, value: &T) -> Result<()> {
1983 if self.flow {
1984 self.ser.with_in_flow(|s| value.serialize(s))?;
1985 } else {
1986 let saved_pending_inline_map = self.ser.pending_inline_map;
1987 let saved_depth = self.ser.depth;
1988 if self.last_key_complex {
1989 if self.align_after_dash && self.ser.at_line_start {
1990 let base = self.depth.saturating_sub(1);
1991 for _ in 0..self.ser.indent_step * base {
1992 self.ser.out.write_char(' ')?;
1993 }
1994 self.ser.out.write_str(" ")?;
1995 self.ser.at_line_start = false;
1996 } else {
1997 self.ser.write_indent(self.depth)?;
1998 }
1999 self.ser.out.write_str(":")?;
2000 self.ser.pending_space_after_colon = true;
2001 self.ser.pending_inline_map = true;
2002 self.ser.at_line_start = false;
2003 self.ser.depth = self.depth;
2004 }
2005 let prev_map_depth = self.ser.current_map_depth.replace(self.depth);
2006 let result = value.serialize(&mut *self.ser);
2007 self.ser.current_map_depth = prev_map_depth;
2008 self.ser.pending_inline_map = saved_pending_inline_map;
2011 if self.last_key_complex {
2012 self.ser.depth = saved_depth;
2013 self.last_key_complex = false;
2014 }
2015 result?;
2016 }
2017 self.first = false;
2018 Ok(())
2019 }
2020
2021 fn end(self) -> Result<()> {
2022 if self.flow {
2023 self.ser.out.write_str("}")?;
2024 if self.ser.in_flow == 0 {
2025 self.ser.newline()?;
2026 }
2027 } else if self.first {
2028 if self.ser.empty_as_braces {
2030 if self.ser.pending_space_after_colon {
2032 self.ser.out.write_str(" ")?;
2033 self.ser.pending_space_after_colon = false;
2034 }
2035 if self.ser.at_line_start {
2037 if self.align_after_dash {
2039 let base = self.depth.saturating_sub(1);
2040 for _ in 0..self.ser.indent_step * base {
2041 self.ser.out.write_char(' ')?;
2042 }
2043 self.ser.out.write_str(" ")?; self.ser.at_line_start = false;
2045 } else {
2046 self.ser.write_indent(self.depth)?;
2047 }
2048 }
2049 self.ser.out.write_str("{}")?;
2050 self.ser.newline()?;
2051 } else {
2052 self.ser.newline()?;
2054 }
2055 }
2056 Ok(())
2057 }
2058}
2059impl<'a, 'b, W: Write> SerializeStruct for MapSer<'a, 'b, W> {
2060 type Ok = ();
2061 type Error = Error;
2062
2063 fn serialize_field<T: ?Sized + Serialize>(
2064 &mut self,
2065 key: &'static str,
2066 value: &T,
2067 ) -> Result<()> {
2068 SerializeMap::serialize_key(self, &key)?;
2069 SerializeMap::serialize_value(self, value)
2070 }
2071 fn end(self) -> Result<()> {
2072 SerializeMap::end(self)
2073 }
2074}
2075
2076pub struct StructVariantSer<'a, 'b, W: Write> {
2081 ser: &'a mut YamlSer<'b, W>,
2083 depth: usize,
2085}
2086impl<'a, 'b, W: Write> SerializeStructVariant for StructVariantSer<'a, 'b, W> {
2087 type Ok = ();
2088 type Error = Error;
2089
2090 fn serialize_field<T: ?Sized + Serialize>(
2091 &mut self,
2092 key: &'static str,
2093 value: &T,
2094 ) -> Result<()> {
2095 let text = scalar_key_to_string(&key)?;
2096 self.ser.write_indent(self.depth)?;
2097 self.ser.out.write_str(&text)?;
2098 self.ser.out.write_str(":")?;
2100 self.ser.pending_space_after_colon = true;
2101 self.ser.at_line_start = false;
2102 let prev_map_depth = self.ser.current_map_depth.replace(self.depth);
2104 let result = value.serialize(&mut *self.ser);
2105 self.ser.current_map_depth = prev_map_depth;
2106 result
2107 }
2108 fn end(self) -> Result<()> {
2109 Ok(())
2110 }
2111}
2112
2113#[derive(Default)]
2122struct UsizeCapture {
2123 v: Option<usize>,
2124}
2125impl<'a> Serializer for &'a mut UsizeCapture {
2126 type Ok = ();
2127 type Error = Error;
2128
2129 type SerializeSeq = ser::Impossible<(), Error>;
2130 type SerializeTuple = ser::Impossible<(), Error>;
2131 type SerializeTupleStruct = ser::Impossible<(), Error>;
2132 type SerializeTupleVariant = ser::Impossible<(), Error>;
2133 type SerializeMap = ser::Impossible<(), Error>;
2134 type SerializeStruct = ser::Impossible<(), Error>;
2135 type SerializeStructVariant = ser::Impossible<(), Error>;
2136
2137 fn serialize_i8(self, v: i8) -> Result<()> {
2138 self.v = Some(v as usize);
2139 Ok(())
2140 }
2141 fn serialize_i16(self, v: i16) -> Result<()> {
2142 self.v = Some(v as usize);
2143 Ok(())
2144 }
2145 fn serialize_i32(self, v: i32) -> Result<()> {
2146 self.v = Some(v as usize);
2147 Ok(())
2148 }
2149 fn serialize_i64(self, v: i64) -> Result<()> {
2150 self.v = Some(v as usize);
2151 Ok(())
2152 }
2153 fn serialize_u8(self, v: u8) -> Result<()> {
2154 self.v = Some(v as usize);
2155 Ok(())
2156 }
2157 fn serialize_u16(self, v: u16) -> Result<()> {
2158 self.v = Some(v as usize);
2159 Ok(())
2160 }
2161 fn serialize_u32(self, v: u32) -> Result<()> {
2162 self.v = Some(v as usize);
2163 Ok(())
2164 }
2165 fn serialize_u64(self, v: u64) -> Result<()> {
2166 self.v = Some(v as usize);
2167 Ok(())
2168 }
2169 fn serialize_f32(self, v: f32) -> Result<()> {
2170 self.v = Some(v as usize);
2171 Ok(())
2172 }
2173 fn serialize_f64(self, v: f64) -> Result<()> {
2174 self.v = Some(v as usize);
2175 Ok(())
2176 }
2177 fn serialize_bool(self, v: bool) -> Result<()> {
2178 self.v = Some(v as usize);
2179 Ok(())
2180 }
2181 fn serialize_char(self, _v: char) -> Result<()> {
2182 Err(Error::unexpected("ptr expects number"))
2183 }
2184 fn serialize_str(self, _v: &str) -> Result<()> {
2185 Err(Error::unexpected("ptr expects number"))
2186 }
2187 fn serialize_bytes(self, _v: &[u8]) -> Result<()> {
2188 Err(Error::unexpected("ptr expects number"))
2189 }
2190 fn serialize_none(self) -> Result<()> {
2191 Err(Error::unexpected("ptr cannot be none"))
2192 }
2193 fn serialize_some<T: ?Sized + Serialize>(self, _value: &T) -> Result<()> {
2194 Err(Error::unexpected("ptr not option"))
2195 }
2196 fn serialize_unit(self) -> Result<()> {
2197 Err(Error::unexpected("ptr cannot be unit"))
2198 }
2199 fn serialize_unit_struct(self, _name: &'static str) -> Result<()> {
2200 unexpected_e()
2201 }
2202 fn serialize_unit_variant(self, _name: &'static str, _i: u32, _v: &'static str) -> Result<()> {
2203 unexpected_e()
2204 }
2205 fn serialize_newtype_struct<T: ?Sized + Serialize>(
2206 self,
2207 _name: &'static str,
2208 _value: &T,
2209 ) -> Result<()> {
2210 unexpected_e()
2211 }
2212 fn serialize_newtype_variant<T: ?Sized + Serialize>(
2213 self,
2214 _name: &'static str,
2215 _i: u32,
2216 _v: &'static str,
2217 _value: &T,
2218 ) -> Result<()> {
2219 unexpected_e()
2220 }
2221 fn serialize_seq(self, _len: Option<usize>) -> Result<ser::Impossible<(), Error>> {
2222 unexpected()
2223 }
2224 fn serialize_tuple(self, _len: usize) -> Result<ser::Impossible<(), Error>> {
2225 unexpected()
2226 }
2227 fn serialize_tuple_struct(
2228 self,
2229 _name: &'static str,
2230 _len: usize,
2231 ) -> Result<ser::Impossible<(), Error>> {
2232 unexpected()
2233 }
2234 fn serialize_tuple_variant(
2235 self,
2236 _name: &'static str,
2237 _i: u32,
2238 _v: &'static str,
2239 _len: usize,
2240 ) -> Result<ser::Impossible<(), Error>> {
2241 unexpected()
2242 }
2243 fn serialize_map(self, _len: Option<usize>) -> Result<ser::Impossible<(), Error>> {
2244 unexpected()
2245 }
2246 fn serialize_struct(
2247 self,
2248 _name: &'static str,
2249 _len: usize,
2250 ) -> Result<ser::Impossible<(), Error>> {
2251 unexpected()
2252 }
2253 fn serialize_struct_variant(
2254 self,
2255 _name: &'static str,
2256 _i: u32,
2257 _v: &'static str,
2258 _len: usize,
2259 ) -> Result<ser::Impossible<(), Error>> {
2260 unexpected()
2261 }
2262 fn collect_str<T: ?Sized + fmt::Display>(self, _value: &T) -> Result<()> {
2263 unexpected_e()
2264 }
2265 fn is_human_readable(&self) -> bool {
2266 true
2267 }
2268}
2269impl UsizeCapture {
2270 fn finish(self) -> Result<usize> {
2271 self.v
2272 .ok_or_else(|| Error::unexpected("missing numeric ptr"))
2273 }
2274}
2275
2276#[derive(Default)]
2280struct BoolCapture {
2281 v: Option<bool>,
2282}
2283impl<'a> Serializer for &'a mut BoolCapture {
2284 type Ok = ();
2285 type Error = Error;
2286
2287 type SerializeSeq = ser::Impossible<(), Error>;
2288 type SerializeTuple = ser::Impossible<(), Error>;
2289 type SerializeTupleStruct = ser::Impossible<(), Error>;
2290 type SerializeTupleVariant = ser::Impossible<(), Error>;
2291 type SerializeMap = ser::Impossible<(), Error>;
2292 type SerializeStruct = ser::Impossible<(), Error>;
2293 type SerializeStructVariant = ser::Impossible<(), Error>;
2294
2295 fn serialize_bool(self, v: bool) -> Result<()> {
2296 self.v = Some(v);
2297 Ok(())
2298 }
2299 fn serialize_i8(self, _v: i8) -> Result<()> {
2300 Err(Error::unexpected("bool expected"))
2301 }
2302 fn serialize_i16(self, _v: i16) -> Result<()> {
2303 Err(Error::unexpected("bool expected"))
2304 }
2305 fn serialize_i32(self, _v: i32) -> Result<()> {
2306 Err(Error::unexpected("bool expected"))
2307 }
2308 fn serialize_i64(self, _v: i64) -> Result<()> {
2309 Err(Error::unexpected("bool expected"))
2310 }
2311 fn serialize_u8(self, _v: u8) -> Result<()> {
2312 Err(Error::unexpected("bool expected"))
2313 }
2314 fn serialize_u16(self, _v: u16) -> Result<()> {
2315 Err(Error::unexpected("bool expected"))
2316 }
2317 fn serialize_u32(self, _v: u32) -> Result<()> {
2318 Err(Error::unexpected("bool expected"))
2319 }
2320 fn serialize_u64(self, _v: u64) -> Result<()> {
2321 Err(Error::unexpected("bool expected"))
2322 }
2323 fn serialize_f32(self, _v: f32) -> Result<()> {
2324 Err(Error::unexpected("bool expected"))
2325 }
2326 fn serialize_f64(self, _v: f64) -> Result<()> {
2327 Err(Error::unexpected("bool expected"))
2328 }
2329 fn serialize_char(self, _c: char) -> Result<()> {
2330 Err(Error::unexpected("bool expected"))
2331 }
2332 fn serialize_str(self, _v: &str) -> Result<()> {
2333 Err(Error::unexpected("bool expected"))
2334 }
2335 fn serialize_bytes(self, _v: &[u8]) -> Result<()> {
2336 Err(Error::unexpected("bool expected"))
2337 }
2338 fn serialize_none(self) -> Result<()> {
2339 Err(Error::unexpected("bool expected"))
2340 }
2341 fn serialize_some<T: ?Sized + Serialize>(self, _v: &T) -> Result<()> {
2342 Err(Error::unexpected("bool expected"))
2343 }
2344 fn serialize_unit(self) -> Result<()> {
2345 Err(Error::unexpected("bool expected"))
2346 }
2347 fn serialize_unit_struct(self, _name: &'static str) -> Result<()> {
2348 unexpected_e()
2349 }
2350 fn serialize_unit_variant(self, _name: &'static str, _i: u32, _v: &'static str) -> Result<()> {
2351 unexpected_e()
2352 }
2353 fn serialize_newtype_struct<T: ?Sized + Serialize>(
2354 self,
2355 _name: &'static str,
2356 _value: &T,
2357 ) -> Result<()> {
2358 unexpected_e()
2359 }
2360 fn serialize_newtype_variant<T: ?Sized + Serialize>(
2361 self,
2362 _name: &'static str,
2363 _i: u32,
2364 _v: &'static str,
2365 _value: &T,
2366 ) -> Result<()> {
2367 unexpected_e()
2368 }
2369 fn serialize_seq(self, _len: Option<usize>) -> Result<ser::Impossible<(), Error>> {
2370 unexpected()
2371 }
2372 fn serialize_tuple(self, _len: usize) -> Result<ser::Impossible<(), Error>> {
2373 unexpected()
2374 }
2375 fn serialize_tuple_struct(
2376 self,
2377 _name: &'static str,
2378 _len: usize,
2379 ) -> Result<ser::Impossible<(), Error>> {
2380 unexpected()
2381 }
2382 fn serialize_tuple_variant(
2383 self,
2384 _name: &'static str,
2385 _i: u32,
2386 _v: &'static str,
2387 _len: usize,
2388 ) -> Result<ser::Impossible<(), Error>> {
2389 unexpected()
2390 }
2391 fn serialize_map(self, _len: Option<usize>) -> Result<ser::Impossible<(), Error>> {
2392 unexpected()
2393 }
2394 fn serialize_struct(
2395 self,
2396 _name: &'static str,
2397 _len: usize,
2398 ) -> Result<ser::Impossible<(), Error>> {
2399 unexpected()
2400 }
2401 fn serialize_struct_variant(
2402 self,
2403 _name: &'static str,
2404 _i: u32,
2405 _v: &'static str,
2406 _len: usize,
2407 ) -> Result<ser::Impossible<(), Error>> {
2408 unexpected()
2409 }
2410 fn collect_str<T: ?Sized + fmt::Display>(self, _value: &T) -> Result<()> {
2411 unexpected_e()
2412 }
2413 fn is_human_readable(&self) -> bool {
2414 true
2415 }
2416}
2417impl BoolCapture {
2418 fn finish(self) -> Result<bool> {
2419 self.v.ok_or_else(|| Error::unexpected("missing bool"))
2420 }
2421}
2422
2423#[derive(Default)]
2427struct StrCapture {
2428 s: Option<String>,
2429}
2430impl<'a> Serializer for &'a mut StrCapture {
2431 type Ok = ();
2432 type Error = Error;
2433
2434 type SerializeSeq = ser::Impossible<(), Error>;
2435 type SerializeTuple = ser::Impossible<(), Error>;
2436 type SerializeTupleStruct = ser::Impossible<(), Error>;
2437 type SerializeTupleVariant = ser::Impossible<(), Error>;
2438 type SerializeMap = ser::Impossible<(), Error>;
2439 type SerializeStruct = ser::Impossible<(), Error>;
2440 type SerializeStructVariant = ser::Impossible<(), Error>;
2441
2442 fn serialize_str(self, v: &str) -> Result<()> {
2443 self.s = Some(v.to_string());
2444 Ok(())
2445 }
2446
2447 fn serialize_bool(self, _v: bool) -> Result<()> {
2448 unexpected_e()
2449 }
2450 fn serialize_i8(self, _v: i8) -> Result<()> {
2451 unexpected_e()
2452 }
2453 fn serialize_i16(self, _v: i16) -> Result<()> {
2454 unexpected_e()
2455 }
2456 fn serialize_i32(self, _v: i32) -> Result<()> {
2457 unexpected_e()
2458 }
2459 fn serialize_i64(self, _v: i64) -> Result<()> {
2460 unexpected_e()
2461 }
2462 fn serialize_i128(self, _v: i128) -> Result<()> {
2463 unexpected_e()
2464 }
2465 fn serialize_u8(self, _v: u8) -> Result<()> {
2466 unexpected_e()
2467 }
2468 fn serialize_u16(self, _v: u16) -> Result<()> {
2469 unexpected_e()
2470 }
2471 fn serialize_u32(self, _v: u32) -> Result<()> {
2472 unexpected_e()
2473 }
2474 fn serialize_u64(self, _v: u64) -> Result<()> {
2475 unexpected_e()
2476 }
2477 fn serialize_u128(self, _v: u128) -> Result<()> {
2478 unexpected_e()
2479 }
2480 fn serialize_f32(self, _v: f32) -> Result<()> {
2481 unexpected_e()
2482 }
2483 fn serialize_f64(self, _v: f64) -> Result<()> {
2484 unexpected_e()
2485 }
2486 fn serialize_char(self, _c: char) -> Result<()> {
2487 unexpected_e()
2488 }
2489 fn serialize_bytes(self, _v: &[u8]) -> Result<()> {
2490 unexpected_e()
2491 }
2492 fn serialize_none(self) -> Result<()> {
2493 unexpected_e()
2494 }
2495 fn serialize_some<T: ?Sized + Serialize>(self, _value: &T) -> Result<()> {
2496 unexpected_e()
2497 }
2498 fn serialize_unit(self) -> Result<()> {
2499 unexpected_e()
2500 }
2501 fn serialize_unit_struct(self, _name: &'static str) -> Result<()> {
2502 unexpected_e()
2503 }
2504 fn serialize_unit_variant(self, _name: &'static str, _i: u32, _v: &'static str) -> Result<()> {
2505 unexpected_e()
2506 }
2507 fn serialize_newtype_struct<T: ?Sized + Serialize>(
2508 self,
2509 _name: &'static str,
2510 _value: &T,
2511 ) -> Result<()> {
2512 unexpected_e()
2513 }
2514 fn serialize_newtype_variant<T: ?Sized + Serialize>(
2515 self,
2516 _name: &'static str,
2517 _i: u32,
2518 _v: &'static str,
2519 _value: &T,
2520 ) -> Result<()> {
2521 unexpected_e()
2522 }
2523 fn serialize_seq(self, _len: Option<usize>) -> Result<ser::Impossible<(), Error>> {
2524 unexpected()
2525 }
2526 fn serialize_tuple(self, _len: usize) -> Result<ser::Impossible<(), Error>> {
2527 unexpected()
2528 }
2529 fn serialize_tuple_struct(
2530 self,
2531 _name: &'static str,
2532 _len: usize,
2533 ) -> Result<ser::Impossible<(), Error>> {
2534 unexpected()
2535 }
2536 fn serialize_tuple_variant(
2537 self,
2538 _name: &'static str,
2539 _i: u32,
2540 _v: &'static str,
2541 _len: usize,
2542 ) -> Result<ser::Impossible<(), Error>> {
2543 unexpected()
2544 }
2545 fn serialize_map(self, _len: Option<usize>) -> Result<ser::Impossible<(), Error>> {
2546 unexpected()
2547 }
2548 fn serialize_struct(
2549 self,
2550 _name: &'static str,
2551 _len: usize,
2552 ) -> Result<ser::Impossible<(), Error>> {
2553 unexpected()
2554 }
2555 fn serialize_struct_variant(
2556 self,
2557 _name: &'static str,
2558 _i: u32,
2559 _v: &'static str,
2560 _len: usize,
2561 ) -> Result<ser::Impossible<(), Error>> {
2562 unexpected()
2563 }
2564 fn collect_str<T: ?Sized + fmt::Display>(self, _value: &T) -> Result<()> {
2565 unexpected_e()
2566 }
2567 fn is_human_readable(&self) -> bool {
2568 true
2569 }
2570}
2571impl StrCapture {
2572 fn finish(self) -> Result<String> {
2573 self.s.ok_or_else(|| Error::unexpected("missing string"))
2574 }
2575}
2576
2577fn scalar_key_to_string<K: Serialize + ?Sized>(key: &K) -> Result<String> {
2585 let mut s = String::new();
2586 {
2587 let mut ks = KeyScalarSink { s: &mut s };
2588 key.serialize(&mut ks)?;
2589 }
2590 Ok(s)
2591}
2592
2593struct KeyScalarSink<'a> {
2594 s: &'a mut String,
2595}
2596
2597impl<'a> Serializer for &'a mut KeyScalarSink<'a> {
2598 type Ok = ();
2599 type Error = Error;
2600
2601 type SerializeSeq = ser::Impossible<(), Error>;
2602 type SerializeTuple = ser::Impossible<(), Error>;
2603 type SerializeTupleStruct = ser::Impossible<(), Error>;
2604 type SerializeTupleVariant = ser::Impossible<(), Error>;
2605 type SerializeMap = ser::Impossible<(), Error>;
2606 type SerializeStruct = ser::Impossible<(), Error>;
2607 type SerializeStructVariant = ser::Impossible<(), Error>;
2608
2609 fn serialize_bool(self, v: bool) -> Result<()> {
2610 self.s.push_str(if v { "true" } else { "false" });
2611 Ok(())
2612 }
2613 fn serialize_i64(self, v: i64) -> Result<()> {
2614 let _ = write!(self.s, "{}", v);
2615 Ok(())
2616 }
2617 fn serialize_i32(self, v: i32) -> Result<()> {
2618 self.serialize_i64(v as i64)
2619 }
2620 fn serialize_i16(self, v: i16) -> Result<()> {
2621 self.serialize_i64(v as i64)
2622 }
2623 fn serialize_i8(self, v: i8) -> Result<()> {
2624 self.serialize_i64(v as i64)
2625 }
2626 fn serialize_i128(self, v: i128) -> Result<()> {
2627 let _ = write!(self.s, "{}", v);
2628 Ok(())
2629 }
2630 fn serialize_u64(self, v: u64) -> Result<()> {
2631 let _ = write!(self.s, "{}", v);
2632 Ok(())
2633 }
2634 fn serialize_u32(self, v: u32) -> Result<()> {
2635 self.serialize_u64(v as u64)
2636 }
2637 fn serialize_u16(self, v: u16) -> Result<()> {
2638 self.serialize_u64(v as u64)
2639 }
2640 fn serialize_u8(self, v: u8) -> Result<()> {
2641 self.serialize_u64(v as u64)
2642 }
2643 fn serialize_u128(self, v: u128) -> Result<()> {
2644 let _ = write!(self.s, "{}", v);
2645 Ok(())
2646 }
2647 fn serialize_f32(self, v: f32) -> Result<()> {
2648 let v = v as f64;
2649 if v.is_nan() {
2650 self.s.push_str(".nan");
2651 } else if v.is_infinite() {
2652 if v.is_sign_positive() {
2653 self.s.push_str(".inf");
2654 } else {
2655 self.s.push_str("-.inf");
2656 }
2657 } else {
2658 let mut buf = ryu::Buffer::new();
2659 let s = buf.format(v);
2660 if !s.contains('.') && !s.contains('e') && !s.contains('E') {
2661 self.s.push_str(s);
2662 self.s.push_str(".0");
2663 } else {
2664 self.s.push_str(s);
2665 }
2666 }
2667 Ok(())
2668 }
2669 fn serialize_f64(self, v: f64) -> Result<()> {
2670 if v.is_nan() {
2671 self.s.push_str(".nan");
2672 } else if v.is_infinite() {
2673 if v.is_sign_positive() {
2674 self.s.push_str(".inf");
2675 } else {
2676 self.s.push_str("-.inf");
2677 }
2678 } else {
2679 let mut buf = ryu::Buffer::new();
2680 let s = buf.format(v);
2681 if !s.contains('.') && !s.contains('e') && !s.contains('E') {
2682 self.s.push_str(s);
2683 self.s.push_str(".0");
2684 } else {
2685 self.s.push_str(s);
2686 }
2687 }
2688 Ok(())
2689 }
2690 fn serialize_char(self, v: char) -> Result<()> {
2691 let mut buf = [0u8; 4];
2692 self.serialize_str(v.encode_utf8(&mut buf))
2693 }
2694 fn serialize_str(self, v: &str) -> Result<()> {
2695 if is_plain_safe(v) {
2696 self.s.push_str(v);
2697 } else {
2698 self.s.push('"');
2699 for ch in v.chars() {
2700 match ch {
2701 '\\' => self.s.push_str("\\\\"),
2702 '"' => self.s.push_str("\\\""),
2703 '\n' => self.s.push_str("\\n"),
2704 '\r' => self.s.push_str("\\r"),
2705 '\t' => self.s.push_str("\\t"),
2706 c if c.is_control() => {
2707 use std::fmt::Write as _;
2708 let _ = write!(self.s, "\\u{:04X}", c as u32);
2710 }
2711 c => self.s.push(c),
2712 }
2713 }
2714 self.s.push('"');
2715 }
2716 Ok(())
2717 }
2718 fn serialize_bytes(self, _v: &[u8]) -> Result<()> {
2719 non_scalar_key_e()
2720 }
2721 fn serialize_none(self) -> Result<()> {
2722 self.s.push_str("null");
2723 Ok(())
2724 }
2725 fn serialize_some<T: ?Sized + Serialize>(self, v: &T) -> Result<()> {
2726 v.serialize(self)
2727 }
2728 fn serialize_unit(self) -> Result<()> {
2729 self.s.push_str("null");
2730 Ok(())
2731 }
2732 fn serialize_unit_struct(self, _name: &'static str) -> Result<()> {
2733 self.serialize_unit()
2734 }
2735 fn serialize_unit_variant(
2736 self,
2737 _name: &'static str,
2738 _idx: u32,
2739 variant: &'static str,
2740 ) -> Result<()> {
2741 self.serialize_str(variant)
2742 }
2743 fn serialize_newtype_struct<T: ?Sized + Serialize>(
2744 self,
2745 _name: &'static str,
2746 _value: &T,
2747 ) -> Result<()> {
2748 non_scalar_key_e()
2749 }
2750 fn serialize_newtype_variant<T: ?Sized + Serialize>(
2751 self,
2752 _: &'static str,
2753 _: u32,
2754 _: &'static str,
2755 _: &T,
2756 ) -> Result<()> {
2757 non_scalar_key_e()
2758 }
2759 fn serialize_seq(self, _len: Option<usize>) -> Result<ser::Impossible<(), Error>> {
2760 non_scalar_key()
2761 }
2762 fn serialize_tuple(self, _len: usize) -> Result<ser::Impossible<(), Error>> {
2763 non_scalar_key()
2764 }
2765 fn serialize_tuple_struct(
2766 self,
2767 _: &'static str,
2768 _: usize,
2769 ) -> Result<ser::Impossible<(), Error>> {
2770 non_scalar_key()
2771 }
2772 fn serialize_tuple_variant(
2773 self,
2774 _: &'static str,
2775 _: u32,
2776 _: &'static str,
2777 _: usize,
2778 ) -> Result<ser::Impossible<(), Error>> {
2779 non_scalar_key()
2780 }
2781 fn serialize_map(self, _len: Option<usize>) -> Result<ser::Impossible<(), Error>> {
2782 non_scalar_key()
2783 }
2784 fn serialize_struct(
2785 self,
2786 _name: &'static str,
2787 _len: usize,
2788 ) -> Result<ser::Impossible<(), Error>> {
2789 non_scalar_key()
2790 }
2791 fn serialize_struct_variant(
2792 self,
2793 _: &'static str,
2794 _: u32,
2795 _: &'static str,
2796 _: usize,
2797 ) -> Result<ser::Impossible<(), Error>> {
2798 non_scalar_key()
2799 }
2800 fn collect_str<T: ?Sized + fmt::Display>(self, v: &T) -> Result<()> {
2801 self.serialize_str(&v.to_string())
2802 }
2803 fn is_human_readable(&self) -> bool {
2804 true
2805 }
2806}
2807
2808fn unexpected() -> Result<ser::Impossible<(), Error>> {
2809 Err(Error::unexpected("unexpected"))
2810}
2811
2812fn unexpected_e() -> Result<()> {
2813 Err(Error::unexpected("unexpected"))
2814}
2815
2816fn non_scalar_key() -> Result<ser::Impossible<(), Error>> {
2817 Err(Error::unexpected("non-scalar key"))
2818}
2819
2820fn non_scalar_key_e() -> Result<()> {
2821 Err(Error::unexpected("non-scalar key"))
2822}