1use core::fmt::Write as _;
2
3use toml_writer::TomlWrite as _;
4
5use super::array_of_tables::ArrayOfTablesSerializer;
6use super::style::Style;
7use super::value::KeySerializer;
8use super::value::ValueSerializer;
9use super::Buffer;
10use super::Error;
11use super::SerializationStrategy;
12use super::Serializer;
13use super::Table;
14use crate::alloc_prelude::*;
15
16#[doc(hidden)]
17pub struct SerializeDocumentTable<'d> {
18 buf: &'d mut Buffer,
19 table: Table,
20 key: Option<String>,
21 style: Style,
22}
23
24impl<'d> SerializeDocumentTable<'d> {
25 pub(crate) fn map(buf: &'d mut Buffer, table: Table, style: Style) -> Result<Self, Error> {
26 Ok(Self {
27 buf,
28 table,
29 key: None,
30 style,
31 })
32 }
33
34 fn end(self) -> Result<&'d mut Buffer, Error> {
35 self.buf.push(self.table);
36 Ok(self.buf)
37 }
38}
39
40impl<'d> serde::ser::SerializeMap for SerializeDocumentTable<'d> {
41 type Ok = &'d mut Buffer;
42 type Error = Error;
43
44 fn serialize_key<T>(&mut self, input: &T) -> Result<(), Self::Error>
45 where
46 T: serde::ser::Serialize + ?Sized,
47 {
48 let mut encoded_key = String::new();
49 input.serialize(KeySerializer {
50 dst: &mut encoded_key,
51 })?;
52 self.key = Some(encoded_key);
53 Ok(())
54 }
55
56 fn serialize_value<T>(&mut self, value: &T) -> Result<(), Self::Error>
57 where
58 T: serde::ser::Serialize + ?Sized,
59 {
60 let encoded_key = self
61 .key
62 .take()
63 .expect("always called after `serialize_key`");
64 match SerializationStrategy::from(value) {
65 SerializationStrategy::Value => {
66 let dst = self.table.body_mut();
67
68 write!(dst, "{encoded_key}")?;
69 dst.space()?;
70 dst.keyval_sep()?;
71 dst.space()?;
72 let value_serializer = ValueSerializer::with_style(dst, self.style);
73 let dst = value.serialize(value_serializer)?;
74 dst.newline()?;
75 }
76 SerializationStrategy::ArrayOfTables => {
77 self.table.has_children(true);
78 let value_serializer = ArrayOfTablesSerializer::new(
79 self.buf,
80 self.table.clone(),
81 encoded_key,
82 self.style,
83 );
84 value.serialize(value_serializer)?;
85 }
86 SerializationStrategy::Table | SerializationStrategy::Unknown => {
87 let child = self.buf.child_table(&mut self.table, encoded_key);
88 let value_serializer = Serializer::with_table(self.buf, child, self.style);
89 value.serialize(value_serializer)?;
90 }
91 SerializationStrategy::Skip => {
92 }
94 }
95 Ok(())
96 }
97
98 fn end(self) -> Result<Self::Ok, Self::Error> {
99 self.end()
100 }
101}
102
103impl<'d> serde::ser::SerializeStruct for SerializeDocumentTable<'d> {
104 type Ok = &'d mut Buffer;
105 type Error = Error;
106
107 fn serialize_field<T>(&mut self, key: &'static str, value: &T) -> Result<(), Self::Error>
108 where
109 T: serde::ser::Serialize + ?Sized,
110 {
111 match SerializationStrategy::from(value) {
112 SerializationStrategy::Value => {
113 let dst = self.table.body_mut();
114
115 dst.key(key)?;
116 dst.space()?;
117 dst.keyval_sep()?;
118 dst.space()?;
119 let value_serializer = ValueSerializer::with_style(dst, self.style);
120 let dst = value.serialize(value_serializer)?;
121 dst.newline()?;
122 }
123 SerializationStrategy::ArrayOfTables => {
124 self.table.has_children(true);
125 let value_serializer = ArrayOfTablesSerializer::new(
126 self.buf,
127 self.table.clone(),
128 key.to_owned(),
129 self.style,
130 );
131 value.serialize(value_serializer)?;
132 }
133 SerializationStrategy::Table | SerializationStrategy::Unknown => {
134 let child = self.buf.child_table(&mut self.table, key.to_owned());
135 let value_serializer = Serializer::with_table(self.buf, child, self.style);
136 value.serialize(value_serializer)?;
137 }
138 SerializationStrategy::Skip => {
139 }
141 }
142
143 Ok(())
144 }
145
146 fn end(self) -> Result<Self::Ok, Self::Error> {
147 self.end()
148 }
149}
150
151impl<'d> serde::ser::SerializeStructVariant for SerializeDocumentTable<'d> {
152 type Ok = &'d mut Buffer;
153 type Error = Error;
154
155 #[inline]
156 fn serialize_field<T>(&mut self, key: &'static str, value: &T) -> Result<(), Self::Error>
157 where
158 T: serde::ser::Serialize + ?Sized,
159 {
160 serde::ser::SerializeStruct::serialize_field(self, key, value)
161 }
162
163 #[inline]
164 fn end(self) -> Result<Self::Ok, Self::Error> {
165 self.end()
166 }
167}