1use super::error::Error;
2use serde::{Serialize, ser};
3
4#[derive(Clone)]
5pub struct Serializer {
6 output: String,
7 indent: usize,
8 braces_stack: Vec<bool>,
10}
11
12impl Serializer {
13 fn write_indent(&mut self) {
14 for _ in 0..self.indent {
15 self.output.push(' ');
16 }
17 }
18}
19
20pub fn to_string<T>(value: &T) -> Result<String, Error>
21where
22 T: Serialize,
23{
24 let mut serializer = Serializer {
25 output: String::new(),
26 indent: 0,
27 braces_stack: Vec::new(),
28 };
29 serializer.output += "config : ";
30 value.serialize(&mut serializer)?;
31 serializer.output += ";\n";
32 Ok(serializer.output)
33}
34
35impl ser::Serializer for &mut Serializer {
36 type Ok = ();
37 type Error = Error;
38
39 type SerializeSeq = Self;
40 type SerializeTuple = Self;
41 type SerializeTupleStruct = Self;
42 type SerializeTupleVariant = Self;
43 type SerializeMap = Self;
44 type SerializeStruct = Self;
45 type SerializeStructVariant = Self;
46
47 fn serialize_bool(self, v: bool) -> Result<Self::Ok, Self::Error> {
48 self.output += if v { "true" } else { "false" };
49 Ok(())
50 }
51
52 fn serialize_i8(self, v: i8) -> Result<Self::Ok, Self::Error> {
53 self.serialize_i32(i32::from(v))
54 }
55
56 fn serialize_i16(self, v: i16) -> Result<Self::Ok, Self::Error> {
57 self.serialize_i32(i32::from(v))
58 }
59
60 fn serialize_i32(self, v: i32) -> Result<Self::Ok, Self::Error> {
61 self.output += &v.to_string();
62 Ok(())
63 }
64
65 fn serialize_i64(self, v: i64) -> Result<Self::Ok, Self::Error> {
66 self.output += &v.to_string();
67 self.output += "L";
68 Ok(())
69 }
70
71 fn serialize_u8(self, v: u8) -> Result<Self::Ok, Self::Error> {
72 self.serialize_u32(u32::from(v))
73 }
74
75 fn serialize_u16(self, v: u16) -> Result<Self::Ok, Self::Error> {
76 self.serialize_u32(u32::from(v))
77 }
78
79 fn serialize_u32(self, v: u32) -> Result<Self::Ok, Self::Error> {
80 self.output += &v.to_string();
81 Ok(())
82 }
83
84 fn serialize_u64(self, v: u64) -> Result<Self::Ok, Self::Error> {
85 self.output += &v.to_string();
86 self.output += "L";
87 Ok(())
88 }
89
90 fn serialize_f32(self, v: f32) -> Result<Self::Ok, Self::Error> {
91 self.output += &format!("{v:?}");
92 Ok(())
93 }
94
95 fn serialize_f64(self, v: f64) -> Result<Self::Ok, Self::Error> {
96 self.output += &format!("{v:?}");
97 Ok(())
98 }
99
100 fn serialize_char(self, v: char) -> Result<Self::Ok, Self::Error> {
101 self.serialize_str(&v.to_string())
102 }
103
104 fn serialize_str(self, v: &str) -> Result<Self::Ok, Self::Error> {
105 self.output += "\"";
106 self.output += v;
107 self.output += "\"";
108 Ok(())
109 }
110
111 fn serialize_bytes(self, _v: &[u8]) -> Result<Self::Ok, Self::Error> {
112 unimplemented!()
113 }
114
115 fn serialize_none(self) -> Result<Self::Ok, Self::Error> {
116 self.output += "[ ]";
117 Ok(())
118 }
119
120 fn serialize_some<T>(self, value: &T) -> Result<Self::Ok, Self::Error>
121 where
122 T: Serialize + ?Sized,
123 {
124 self.output += "[ ";
125 value.serialize(&mut *self)?;
126 self.output += " ]";
127 Ok(())
128 }
129
130 fn serialize_unit(self) -> Result<Self::Ok, Self::Error> {
131 self.output += "[ ]";
132 Ok(())
133 }
134
135 fn serialize_unit_struct(self, _name: &'static str) -> Result<Self::Ok, Self::Error> {
136 self.output += "[ ]";
137 Ok(())
138 }
139
140 fn serialize_unit_variant(
141 self,
142 _name: &'static str,
143 _variant_index: u32,
144 variant: &'static str,
145 ) -> Result<Self::Ok, Self::Error> {
146 self.output += &format!("\"{variant}\"");
147 Ok(())
148 }
149
150 fn serialize_newtype_struct<T>(
151 self,
152 _name: &'static str,
153 value: &T,
154 ) -> Result<Self::Ok, Self::Error>
155 where
156 T: Serialize + ?Sized,
157 {
158 value.serialize(self)
159 }
160
161 fn serialize_newtype_variant<T>(
162 self,
163 _name: &'static str,
164 _variant_index: u32,
165 variant: &'static str,
166 value: &T,
167 ) -> Result<Self::Ok, Self::Error>
168 where
169 T: Serialize + ?Sized,
170 {
171 self.output += "{\n";
172 self.indent += 4;
173 self.write_indent();
174 self.output += variant;
175 self.output += " : ( ";
176 value.serialize(&mut *self)?;
177 self.output += " );\n";
178 self.indent -= 4;
179 self.write_indent();
180 self.output += "}";
181 Ok(())
182 }
183
184 fn serialize_seq(self, _len: Option<usize>) -> Result<Self::SerializeSeq, Self::Error> {
185 self.output += "( ";
186 Ok(self)
187 }
188
189 fn serialize_tuple(self, _len: usize) -> Result<Self::SerializeTuple, Self::Error> {
190 self.output += "[ ";
191 Ok(self)
192 }
193
194 fn serialize_tuple_struct(
195 self,
196 _name: &'static str,
197 _len: usize,
198 ) -> Result<Self::SerializeTupleStruct, Self::Error> {
199 unimplemented!()
200 }
201
202 fn serialize_tuple_variant(
203 self,
204 _name: &'static str,
205 _variant_index: u32,
206 _variant: &'static str,
207 _len: usize,
208 ) -> Result<Self::SerializeTupleVariant, Self::Error> {
209 unimplemented!()
210 }
211
212 fn serialize_map(self, _len: Option<usize>) -> Result<Self::SerializeMap, Self::Error> {
213 self.output += "{\n";
214 self.indent += 4;
215 self.braces_stack.push(true);
216 Ok(self)
217 }
218
219 fn serialize_struct(
220 self,
221 _name: &'static str,
222 _len: usize,
223 ) -> Result<Self::SerializeStruct, Self::Error> {
224 self.output += "{\n";
225 self.indent += 4;
226 self.braces_stack.push(true);
227 Ok(self)
228 }
229
230 fn serialize_struct_variant(
231 self,
232 _name: &'static str,
233 _variant_index: u32,
234 variant: &'static str,
235 _len: usize,
236 ) -> Result<Self::SerializeStructVariant, Self::Error> {
237 self.output += "{\n";
238 self.indent += 4;
239 self.write_indent();
240 self.output += variant;
241 self.output += " : {\n";
242 self.indent += 4;
243 self.braces_stack.push(true);
244 self.braces_stack.push(true);
245 Ok(self)
246 }
247}
248
249impl ser::SerializeSeq for &mut Serializer {
250 type Ok = ();
251 type Error = Error;
252
253 fn serialize_element<T>(&mut self, value: &T) -> Result<(), Self::Error>
254 where
255 T: Serialize + ?Sized,
256 {
257 if !self.output.ends_with("( ") {
258 self.output += ", ";
259 }
260 value.serialize(&mut **self)?;
261 Ok(())
262 }
263
264 fn end(self) -> Result<Self::Ok, Self::Error> {
265 self.output += " )";
266 Ok(())
267 }
268}
269
270impl ser::SerializeTuple for &mut Serializer {
271 type Ok = ();
272 type Error = Error;
273
274 fn serialize_element<T>(&mut self, value: &T) -> Result<(), Self::Error>
275 where
276 T: Serialize + ?Sized,
277 {
278 if !self.output.ends_with("[ ") {
279 self.output += ", ";
280 }
281 value.serialize(&mut **self)?;
282 Ok(())
283 }
284
285 fn end(self) -> Result<Self::Ok, Self::Error> {
286 self.output += " ]";
287 Ok(())
288 }
289}
290
291impl ser::SerializeTupleStruct for &mut Serializer {
292 type Ok = ();
293 type Error = Error;
294
295 fn serialize_field<T>(&mut self, _value: &T) -> Result<(), Self::Error>
296 where
297 T: Serialize + ?Sized,
298 {
299 unimplemented!()
300 }
301
302 fn end(self) -> Result<Self::Ok, Self::Error> {
303 unimplemented!()
304 }
305}
306
307impl ser::SerializeTupleVariant for &mut Serializer {
308 type Ok = ();
309 type Error = Error;
310
311 fn serialize_field<T>(&mut self, _value: &T) -> Result<(), Self::Error>
312 where
313 T: Serialize + ?Sized,
314 {
315 unimplemented!()
316 }
317
318 fn end(self) -> Result<Self::Ok, Self::Error> {
319 unimplemented!()
320 }
321}
322
323impl ser::SerializeMap for &mut Serializer {
324 type Ok = ();
325 type Error = Error;
326
327 fn serialize_key<T>(&mut self, key: &T) -> Result<(), Self::Error>
328 where
329 T: Serialize + ?Sized,
330 {
331 self.write_indent();
332 let start = self.output.len();
333 key.serialize(&mut **self)?;
334 let key_part = self.output[start..].to_string();
336 if key_part.starts_with('"') && key_part.ends_with('"') && key_part.len() > 2 {
337 self.output.truncate(start);
338 self.output += &key_part[1..key_part.len() - 1];
339 }
340 self.output += " : ";
341 Ok(())
342 }
343
344 fn serialize_value<T>(&mut self, value: &T) -> Result<(), Self::Error>
345 where
346 T: Serialize + ?Sized,
347 {
348 value.serialize(&mut **self)?;
349 self.output += ";\n";
350 Ok(())
351 }
352
353 fn end(self) -> Result<Self::Ok, Self::Error> {
354 if let Some(true) = self.braces_stack.pop() {
355 self.indent -= 4;
356 self.write_indent();
357 self.output += "}";
358 }
359 Ok(())
360 }
361}
362
363impl ser::SerializeStruct for &mut Serializer {
364 type Ok = ();
365 type Error = Error;
366
367 fn serialize_field<T>(&mut self, key: &'static str, value: &T) -> Result<(), Self::Error>
368 where
369 T: Serialize + ?Sized,
370 {
371 self.write_indent();
372 self.output += key;
373 self.output += " : ";
374 value.serialize(&mut **self)?;
375 self.output += ";\n";
376 Ok(())
377 }
378
379 fn end(self) -> Result<Self::Ok, Self::Error> {
380 if let Some(true) = self.braces_stack.pop() {
381 self.indent -= 4;
382 self.write_indent();
383 self.output += "}";
384 }
385 Ok(())
386 }
387}
388
389impl ser::SerializeStructVariant for &mut Serializer {
390 type Ok = ();
391 type Error = Error;
392
393 fn serialize_field<T>(&mut self, key: &'static str, value: &T) -> Result<(), Self::Error>
394 where
395 T: Serialize + ?Sized,
396 {
397 self.write_indent();
398 self.output += key;
399 self.output += " : ";
400 value.serialize(&mut **self)?;
401 self.output += ";\n";
402 Ok(())
403 }
404
405 fn end(self) -> Result<Self::Ok, Self::Error> {
406 if let Some(true) = self.braces_stack.pop() {
408 self.indent -= 4;
409 self.write_indent();
410 self.output += "}";
411 }
412 if let Some(true) = self.braces_stack.pop() {
414 self.output += ";\n";
415 self.indent -= 4;
416 self.write_indent();
417 self.output += "}";
418 }
419 Ok(())
420 }
421}