1use std::fmt::Write as FmtWrite;
26
27use crate::error::{Error, Result};
28use serde::ser::{self, Serialize};
29
30pub fn to_string<T: Serialize>(value: &T) -> Result<String> {
59 let mut ser = Serializer::new(0);
60 value.serialize(&mut ser)?;
61 Ok(ser.output)
62}
63
64pub struct Serializer {
73 pub(crate) output: String,
75 indent: usize,
77}
78
79impl Serializer {
80 fn new(indent: usize) -> Self {
82 Serializer {
83 output: String::new(),
84 indent,
85 }
86 }
87
88 fn pad(&self) -> String {
90 " ".repeat(self.indent)
91 }
92}
93
94fn escape(s: &str) -> String {
112 if s.is_empty()
113 || s.chars()
114 .any(|c| matches!(c, ' ' | '\t' | '\n' | '\r' | '#' | '{' | '}' | '='))
115 {
116 format!("\"{s}\"")
117 } else {
118 s.to_owned()
119 }
120}
121
122impl<'a> ser::Serializer for &'a mut Serializer {
127 type Ok = ();
128 type Error = Error;
129
130 type SerializeSeq = SeqSerializer<'a>;
132 type SerializeTuple = SeqSerializer<'a>;
134 type SerializeTupleStruct = SeqSerializer<'a>;
136 type SerializeTupleVariant = SeqSerializer<'a>;
138 type SerializeMap = MapSerializer<'a>;
140 type SerializeStruct = MapSerializer<'a>;
142 type SerializeStructVariant = MapSerializer<'a>;
144
145 fn serialize_bool(self, v: bool) -> Result<()> {
146 self.output.push_str(if v { "true" } else { "false" });
147 Ok(())
148 }
149
150 fn serialize_i8(self, v: i8) -> Result<()> {
151 write!(self.output, "{v}").map_err(|e| Error::Message(e.to_string()))
152 }
153
154 fn serialize_i16(self, v: i16) -> Result<()> {
155 write!(self.output, "{v}").map_err(|e| Error::Message(e.to_string()))
156 }
157
158 fn serialize_i32(self, v: i32) -> Result<()> {
159 write!(self.output, "{v}").map_err(|e| Error::Message(e.to_string()))
160 }
161
162 fn serialize_i64(self, v: i64) -> Result<()> {
163 write!(self.output, "{v}").map_err(|e| Error::Message(e.to_string()))
164 }
165
166 fn serialize_u8(self, v: u8) -> Result<()> {
167 write!(self.output, "{v}").map_err(|e| Error::Message(e.to_string()))
168 }
169
170 fn serialize_u16(self, v: u16) -> Result<()> {
171 write!(self.output, "{v}").map_err(|e| Error::Message(e.to_string()))
172 }
173
174 fn serialize_u32(self, v: u32) -> Result<()> {
175 write!(self.output, "{v}").map_err(|e| Error::Message(e.to_string()))
176 }
177
178 fn serialize_u64(self, v: u64) -> Result<()> {
179 write!(self.output, "{v}").map_err(|e| Error::Message(e.to_string()))
180 }
181
182 fn serialize_f32(self, v: f32) -> Result<()> {
183 write!(self.output, "{v}").map_err(|e| Error::Message(e.to_string()))
184 }
185
186 fn serialize_f64(self, v: f64) -> Result<()> {
187 write!(self.output, "{v}").map_err(|e| Error::Message(e.to_string()))
188 }
189
190 fn serialize_char(self, v: char) -> Result<()> {
191 self.output.push_str(&escape(&v.to_string()));
193 Ok(())
194 }
195
196 fn serialize_str(self, v: &str) -> Result<()> {
197 self.output.push_str(&escape(v));
198 Ok(())
199 }
200
201 fn serialize_bytes(self, _v: &[u8]) -> Result<()> {
202 Err(Error::UnsupportedType("bytes"))
203 }
204
205 fn serialize_none(self) -> Result<()> {
206 self.output.push_str("null");
207 Ok(())
208 }
209
210 fn serialize_some<T: Serialize + ?Sized>(self, value: &T) -> Result<()> {
211 value.serialize(self)
212 }
213
214 fn serialize_unit(self) -> Result<()> {
215 self.output.push_str("null");
216 Ok(())
217 }
218
219 fn serialize_unit_struct(self, _name: &'static str) -> Result<()> {
220 self.serialize_unit()
221 }
222
223 fn serialize_unit_variant(
224 self,
225 _name: &'static str,
226 _index: u32,
227 variant: &'static str,
228 ) -> Result<()> {
229 self.serialize_str(variant)
230 }
231
232 fn serialize_newtype_struct<T: Serialize + ?Sized>(
233 self,
234 _name: &'static str,
235 value: &T,
236 ) -> Result<()> {
237 value.serialize(self)
238 }
239
240 fn serialize_newtype_variant<T: Serialize + ?Sized>(
241 self,
242 _name: &'static str,
243 _index: u32,
244 variant: &'static str,
245 value: &T,
246 ) -> Result<()> {
247 let mut ms = MapSerializer {
251 ser: self,
252 current_key: None,
253 variant_name: None,
254 };
255 ms.write_kv(variant, value)
256 }
257
258 fn serialize_seq(self, _len: Option<usize>) -> Result<Self::SerializeSeq> {
259 Ok(SeqSerializer {
260 parent: self,
261 items: Vec::new(),
262 variant: None,
263 })
264 }
265
266 fn serialize_tuple(self, len: usize) -> Result<Self::SerializeTuple> {
267 self.serialize_seq(Some(len))
268 }
269
270 fn serialize_tuple_struct(
271 self,
272 _name: &'static str,
273 len: usize,
274 ) -> Result<Self::SerializeTupleStruct> {
275 self.serialize_seq(Some(len))
276 }
277
278 fn serialize_tuple_variant(
279 self,
280 _name: &'static str,
281 _index: u32,
282 variant: &'static str,
283 _len: usize,
284 ) -> Result<Self::SerializeTupleVariant> {
285 Ok(SeqSerializer {
286 parent: self,
287 items: Vec::new(),
288 variant: Some(variant.to_owned()),
289 })
290 }
291
292 fn serialize_map(self, _len: Option<usize>) -> Result<Self::SerializeMap> {
293 Ok(MapSerializer {
294 ser: self,
295 current_key: None,
296 variant_name: None,
297 })
298 }
299
300 fn serialize_struct(self, _name: &'static str, len: usize) -> Result<Self::SerializeStruct> {
301 self.serialize_map(Some(len))
302 }
303
304 fn serialize_struct_variant(
305 self,
306 _name: &'static str,
307 _index: u32,
308 variant: &'static str,
309 _len: usize,
310 ) -> Result<Self::SerializeStructVariant> {
311 Ok(MapSerializer {
312 ser: self,
313 current_key: None,
314 variant_name: Some(variant.to_owned()),
315 })
316 }
317}
318
319pub struct SeqSerializer<'a> {
326 parent: &'a mut Serializer,
327 items: Vec<String>,
329 variant: Option<String>,
331}
332
333impl ser::SerializeSeq for SeqSerializer<'_> {
334 type Ok = ();
335 type Error = Error;
336
337 fn serialize_element<T: Serialize + ?Sized>(&mut self, value: &T) -> Result<()> {
338 let mut inner = Serializer::new(0);
339 value.serialize(&mut inner)?;
340 self.items.push(inner.output);
341 Ok(())
342 }
343
344 fn end(self) -> Result<()> {
345 let pad = self.parent.pad();
346 let inner_pad = " ".repeat(self.parent.indent + 2);
347 writeln!(self.parent.output, "{{").map_err(|e| Error::Message(e.to_string()))?;
348 for item in &self.items {
349 writeln!(self.parent.output, "{inner_pad}{item}")
350 .map_err(|e| Error::Message(e.to_string()))?;
351 }
352 writeln!(self.parent.output, "{pad}}}").map_err(|e| Error::Message(e.to_string()))
353 }
354}
355
356impl ser::SerializeTuple for SeqSerializer<'_> {
357 type Ok = ();
358 type Error = Error;
359
360 fn serialize_element<T: Serialize + ?Sized>(&mut self, value: &T) -> Result<()> {
361 ser::SerializeSeq::serialize_element(self, value)
362 }
363
364 fn end(self) -> Result<()> {
365 ser::SerializeSeq::end(self)
366 }
367}
368
369impl ser::SerializeTupleStruct for SeqSerializer<'_> {
370 type Ok = ();
371 type Error = Error;
372
373 fn serialize_field<T: Serialize + ?Sized>(&mut self, value: &T) -> Result<()> {
374 ser::SerializeSeq::serialize_element(self, value)
375 }
376
377 fn end(self) -> Result<()> {
378 ser::SerializeSeq::end(self)
379 }
380}
381
382impl ser::SerializeTupleVariant for SeqSerializer<'_> {
383 type Ok = ();
384 type Error = Error;
385
386 fn serialize_field<T: Serialize + ?Sized>(&mut self, value: &T) -> Result<()> {
387 ser::SerializeSeq::serialize_element(self, value)
388 }
389
390 fn end(self) -> Result<()> {
391 let variant = self.variant.ok_or_else(|| {
394 Error::Message("variant name missing in SerializeTupleVariant::end".into())
395 })?;
396 let pad = self.parent.pad();
397 let inner_pad = " ".repeat(self.parent.indent + 2);
398 writeln!(self.parent.output, "{pad}{} = {{", escape(&variant))
399 .map_err(|e| Error::Message(e.to_string()))?;
400 for item in &self.items {
401 writeln!(self.parent.output, "{inner_pad}{item}")
402 .map_err(|e| Error::Message(e.to_string()))?;
403 }
404 writeln!(self.parent.output, "{pad}}}").map_err(|e| Error::Message(e.to_string()))
405 }
406}
407
408struct KeySerializer(String);
417
418impl ser::Serializer for &mut KeySerializer {
419 type Ok = ();
420 type Error = Error;
421 type SerializeSeq = ser::Impossible<(), Error>;
422 type SerializeTuple = ser::Impossible<(), Error>;
423 type SerializeTupleStruct = ser::Impossible<(), Error>;
424 type SerializeTupleVariant = ser::Impossible<(), Error>;
425 type SerializeMap = ser::Impossible<(), Error>;
426 type SerializeStruct = ser::Impossible<(), Error>;
427 type SerializeStructVariant = ser::Impossible<(), Error>;
428
429 fn serialize_str(self, v: &str) -> Result<()> {
430 v.clone_into(&mut self.0);
431 Ok(())
432 }
433
434 fn serialize_bool(self, _v: bool) -> Result<()> {
435 Err(Error::KeyMustBeString)
436 }
437 fn serialize_i8(self, _v: i8) -> Result<()> {
438 Err(Error::KeyMustBeString)
439 }
440 fn serialize_i16(self, _v: i16) -> Result<()> {
441 Err(Error::KeyMustBeString)
442 }
443 fn serialize_i32(self, _v: i32) -> Result<()> {
444 Err(Error::KeyMustBeString)
445 }
446 fn serialize_i64(self, _v: i64) -> Result<()> {
447 Err(Error::KeyMustBeString)
448 }
449 fn serialize_u8(self, _v: u8) -> Result<()> {
450 Err(Error::KeyMustBeString)
451 }
452 fn serialize_u16(self, _v: u16) -> Result<()> {
453 Err(Error::KeyMustBeString)
454 }
455 fn serialize_u32(self, _v: u32) -> Result<()> {
456 Err(Error::KeyMustBeString)
457 }
458 fn serialize_u64(self, _v: u64) -> Result<()> {
459 Err(Error::KeyMustBeString)
460 }
461 fn serialize_f32(self, _v: f32) -> Result<()> {
462 Err(Error::KeyMustBeString)
463 }
464 fn serialize_f64(self, _v: f64) -> Result<()> {
465 Err(Error::KeyMustBeString)
466 }
467 fn serialize_char(self, _v: char) -> Result<()> {
468 Err(Error::KeyMustBeString)
469 }
470 fn serialize_bytes(self, _v: &[u8]) -> Result<()> {
471 Err(Error::KeyMustBeString)
472 }
473 fn serialize_none(self) -> Result<()> {
474 Err(Error::KeyMustBeString)
475 }
476 fn serialize_some<T: Serialize + ?Sized>(self, _v: &T) -> Result<()> {
477 Err(Error::KeyMustBeString)
478 }
479 fn serialize_unit(self) -> Result<()> {
480 Err(Error::KeyMustBeString)
481 }
482 fn serialize_unit_struct(self, _name: &'static str) -> Result<()> {
483 Err(Error::KeyMustBeString)
484 }
485 fn serialize_unit_variant(
486 self,
487 _name: &'static str,
488 _idx: u32,
489 _variant: &'static str,
490 ) -> Result<()> {
491 Err(Error::KeyMustBeString)
492 }
493 fn serialize_newtype_struct<T: Serialize + ?Sized>(
494 self,
495 _name: &'static str,
496 value: &T,
497 ) -> Result<()> {
498 value.serialize(self)
499 }
500 fn serialize_newtype_variant<T: Serialize + ?Sized>(
501 self,
502 _name: &'static str,
503 _idx: u32,
504 _variant: &'static str,
505 _value: &T,
506 ) -> Result<()> {
507 Err(Error::KeyMustBeString)
508 }
509 fn serialize_seq(self, _len: Option<usize>) -> Result<Self::SerializeSeq> {
510 Err(Error::KeyMustBeString)
511 }
512 fn serialize_tuple(self, _len: usize) -> Result<Self::SerializeTuple> {
513 Err(Error::KeyMustBeString)
514 }
515 fn serialize_tuple_struct(
516 self,
517 _name: &'static str,
518 _len: usize,
519 ) -> Result<Self::SerializeTupleStruct> {
520 Err(Error::KeyMustBeString)
521 }
522 fn serialize_tuple_variant(
523 self,
524 _name: &'static str,
525 _idx: u32,
526 _variant: &'static str,
527 _len: usize,
528 ) -> Result<Self::SerializeTupleVariant> {
529 Err(Error::KeyMustBeString)
530 }
531 fn serialize_map(self, _len: Option<usize>) -> Result<Self::SerializeMap> {
532 Err(Error::KeyMustBeString)
533 }
534 fn serialize_struct(self, _name: &'static str, _len: usize) -> Result<Self::SerializeStruct> {
535 Err(Error::KeyMustBeString)
536 }
537 fn serialize_struct_variant(
538 self,
539 _name: &'static str,
540 _idx: u32,
541 _variant: &'static str,
542 _len: usize,
543 ) -> Result<Self::SerializeStructVariant> {
544 Err(Error::KeyMustBeString)
545 }
546}
547
548pub struct MapSerializer<'a> {
555 ser: &'a mut Serializer,
556 current_key: Option<String>,
558 variant_name: Option<String>,
560}
561
562impl MapSerializer<'_> {
563 fn write_kv<T: Serialize + ?Sized>(&mut self, key: &str, value: &T) -> Result<()> {
565 let indent = self.ser.indent;
566 let pad = " ".repeat(indent);
567
568 let mut first = Serializer::new(indent);
581 value.serialize(&mut first)?;
582 let rendered = first.output;
583
584 if rendered.contains('\n')
585 && !rendered.trim_start().starts_with('{')
586 && !rendered.trim_start().starts_with('"')
587 {
588 writeln!(self.ser.output, "{pad}{} {{", escape(key))
595 .map_err(|e| Error::Message(e.to_string()))?;
596 let mut inner = Serializer::new(indent + 2);
597 value.serialize(&mut inner)?;
598 self.ser.output.push_str(&inner.output);
599 writeln!(self.ser.output, "{pad}}}").map_err(|e| Error::Message(e.to_string()))?;
600 } else if rendered.contains('\n') {
601 writeln!(
606 self.ser.output,
607 "{pad}{} = {}",
608 escape(key),
609 rendered.trim_end()
610 )
611 .map_err(|e| Error::Message(e.to_string()))?;
612 } else {
613 let rendered = rendered.trim_end_matches('\n');
615 writeln!(self.ser.output, "{pad}{} = {rendered}", escape(key))
616 .map_err(|e| Error::Message(e.to_string()))?;
617 }
618 Ok(())
619 }
620}
621
622impl ser::SerializeMap for MapSerializer<'_> {
623 type Ok = ();
624 type Error = Error;
625
626 fn serialize_key<T: Serialize + ?Sized>(&mut self, key: &T) -> Result<()> {
627 let mut ks = KeySerializer(String::new());
628 key.serialize(&mut ks)?;
629 self.current_key = Some(ks.0);
630 Ok(())
631 }
632
633 fn serialize_value<T: Serialize + ?Sized>(&mut self, value: &T) -> Result<()> {
634 let key = self
635 .current_key
636 .take()
637 .ok_or_else(|| Error::Parse("serialize_value called before serialize_key".into()))?;
638 self.write_kv(&key, value)
639 }
640
641 fn end(self) -> Result<()> {
642 if let Some(variant) = self.variant_name {
643 let pad = " ".repeat(self.ser.indent.saturating_sub(2));
645 let header = format!("{pad}{} {{\n", escape(&variant));
646 let footer = format!("{pad}}}\n");
647 self.ser.output.insert_str(0, &header);
648 self.ser.output.push_str(&footer);
649 }
650 Ok(())
651 }
652}
653
654impl ser::SerializeStruct for MapSerializer<'_> {
655 type Ok = ();
656 type Error = Error;
657
658 fn serialize_field<T: Serialize + ?Sized>(
659 &mut self,
660 key: &'static str,
661 value: &T,
662 ) -> Result<()> {
663 self.write_kv(key, value)
664 }
665
666 fn end(self) -> Result<()> {
667 ser::SerializeMap::end(self)
668 }
669}
670
671impl ser::SerializeStructVariant for MapSerializer<'_> {
672 type Ok = ();
673 type Error = Error;
674
675 fn serialize_field<T: Serialize + ?Sized>(
676 &mut self,
677 key: &'static str,
678 value: &T,
679 ) -> Result<()> {
680 self.write_kv(key, value)
681 }
682
683 fn end(self) -> Result<()> {
684 ser::SerializeMap::end(self)
685 }
686}