1 //! Serializing Rust structures into TOML.
2 //!
3 //! This module contains all the Serde support for serializing Rust structures
4 //! into TOML documents (as strings). Note that some top-level functions here
5 //! are also provided at the top of the crate.
6 
7 /// Serialize the given data structure as a String of TOML.
8 ///
9 /// Serialization can fail if `T`'s implementation of `Serialize` decides to
10 /// fail, if `T` contains a map with non-string keys, or if `T` attempts to
11 /// serialize an unsupported datatype such as an enum, tuple, or tuple struct.
12 ///
13 /// To serialize TOML values, instead of documents, see [`ValueSerializer`].
14 ///
15 /// # Examples
16 ///
17 /// ```
18 /// use serde::Serialize;
19 ///
20 /// #[derive(Serialize)]
21 /// struct Config {
22 ///     database: Database,
23 /// }
24 ///
25 /// #[derive(Serialize)]
26 /// struct Database {
27 ///     ip: String,
28 ///     port: Vec<u16>,
29 ///     connection_max: u32,
30 ///     enabled: bool,
31 /// }
32 ///
33 /// let config = Config {
34 ///     database: Database {
35 ///         ip: "192.168.1.1".to_string(),
36 ///         port: vec![8001, 8002, 8003],
37 ///         connection_max: 5000,
38 ///         enabled: false,
39 ///     },
40 /// };
41 ///
42 /// let toml = toml::to_string(&config).unwrap();
43 /// println!("{}", toml)
44 /// ```
45 #[cfg(feature = "display")]
to_string<T: ?Sized>(value: &T) -> Result<String, Error> where T: serde::ser::Serialize,46 pub fn to_string<T: ?Sized>(value: &T) -> Result<String, Error>
47 where
48     T: serde::ser::Serialize,
49 {
50     let mut output = String::new();
51     let serializer = Serializer::new(&mut output);
52     value.serialize(serializer)?;
53     Ok(output)
54 }
55 
56 /// Serialize the given data structure as a "pretty" String of TOML.
57 ///
58 /// This is identical to `to_string` except the output string has a more
59 /// "pretty" output. See `Serializer::pretty` for more details.
60 ///
61 /// To serialize TOML values, instead of documents, see [`ValueSerializer`].
62 ///
63 /// For greater customization, instead serialize to a
64 /// [`toml_edit::Document`](https://docs.rs/toml_edit/latest/toml_edit/struct.Document.html).
65 #[cfg(feature = "display")]
to_string_pretty<T: ?Sized>(value: &T) -> Result<String, Error> where T: serde::ser::Serialize,66 pub fn to_string_pretty<T: ?Sized>(value: &T) -> Result<String, Error>
67 where
68     T: serde::ser::Serialize,
69 {
70     let mut output = String::new();
71     let serializer = Serializer::pretty(&mut output);
72     value.serialize(serializer)?;
73     Ok(output)
74 }
75 
76 /// Errors that can occur when serializing a type.
77 #[derive(Debug, Clone, PartialEq, Eq)]
78 pub struct Error {
79     pub(crate) inner: crate::edit::ser::Error,
80 }
81 
82 impl Error {
new(inner: impl std::fmt::Display) -> Self83     pub(crate) fn new(inner: impl std::fmt::Display) -> Self {
84         Self {
85             inner: crate::edit::ser::Error::Custom(inner.to_string()),
86         }
87     }
88 
89     #[cfg(feature = "display")]
wrap(inner: crate::edit::ser::Error) -> Self90     pub(crate) fn wrap(inner: crate::edit::ser::Error) -> Self {
91         Self { inner }
92     }
93 
unsupported_type(t: Option<&'static str>) -> Self94     pub(crate) fn unsupported_type(t: Option<&'static str>) -> Self {
95         Self {
96             inner: crate::edit::ser::Error::UnsupportedType(t),
97         }
98     }
99 
unsupported_none() -> Self100     pub(crate) fn unsupported_none() -> Self {
101         Self {
102             inner: crate::edit::ser::Error::UnsupportedNone,
103         }
104     }
105 
key_not_string() -> Self106     pub(crate) fn key_not_string() -> Self {
107         Self {
108             inner: crate::edit::ser::Error::KeyNotString,
109         }
110     }
111 }
112 
113 impl serde::ser::Error for Error {
custom<T>(msg: T) -> Self where T: std::fmt::Display,114     fn custom<T>(msg: T) -> Self
115     where
116         T: std::fmt::Display,
117     {
118         Error::new(msg)
119     }
120 }
121 
122 impl std::fmt::Display for Error {
fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result123     fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
124         self.inner.fmt(f)
125     }
126 }
127 
128 impl std::error::Error for Error {}
129 
130 /// Serialization for TOML documents.
131 ///
132 /// This structure implements serialization support for TOML to serialize an
133 /// arbitrary type to TOML. Note that the TOML format does not support all
134 /// datatypes in Rust, such as enums, tuples, and tuple structs. These types
135 /// will generate an error when serialized.
136 ///
137 /// Currently a serializer always writes its output to an in-memory `String`,
138 /// which is passed in when creating the serializer itself.
139 ///
140 /// To serialize TOML values, instead of documents, see [`ValueSerializer`].
141 #[non_exhaustive]
142 #[cfg(feature = "display")]
143 pub struct Serializer<'d> {
144     dst: &'d mut String,
145     settings: crate::fmt::DocumentFormatter,
146 }
147 
148 #[cfg(feature = "display")]
149 impl<'d> Serializer<'d> {
150     /// Creates a new serializer which will emit TOML into the buffer provided.
151     ///
152     /// The serializer can then be used to serialize a type after which the data
153     /// will be present in `dst`.
new(dst: &'d mut String) -> Self154     pub fn new(dst: &'d mut String) -> Self {
155         Self {
156             dst,
157             settings: Default::default(),
158         }
159     }
160 
161     /// Apply a default "pretty" policy to the document
162     ///
163     /// For greater customization, instead serialize to a
164     /// [`toml_edit::Document`](https://docs.rs/toml_edit/latest/toml_edit/struct.Document.html).
pretty(dst: &'d mut String) -> Self165     pub fn pretty(dst: &'d mut String) -> Self {
166         let mut ser = Serializer::new(dst);
167         ser.settings.multiline_array = true;
168         ser
169     }
170 }
171 
172 #[cfg(feature = "display")]
173 impl<'d> serde::ser::Serializer for Serializer<'d> {
174     type Ok = ();
175     type Error = Error;
176     type SerializeSeq = SerializeDocumentArray<'d>;
177     type SerializeTuple = SerializeDocumentArray<'d>;
178     type SerializeTupleStruct = SerializeDocumentArray<'d>;
179     type SerializeTupleVariant = SerializeDocumentArray<'d>;
180     type SerializeMap = SerializeDocumentTable<'d>;
181     type SerializeStruct = SerializeDocumentTable<'d>;
182     type SerializeStructVariant = serde::ser::Impossible<Self::Ok, Self::Error>;
183 
serialize_bool(self, v: bool) -> Result<Self::Ok, Self::Error>184     fn serialize_bool(self, v: bool) -> Result<Self::Ok, Self::Error> {
185         write_document(
186             self.dst,
187             self.settings,
188             toml_edit::ser::ValueSerializer::new().serialize_bool(v),
189         )
190     }
191 
serialize_i8(self, v: i8) -> Result<Self::Ok, Self::Error>192     fn serialize_i8(self, v: i8) -> Result<Self::Ok, Self::Error> {
193         write_document(
194             self.dst,
195             self.settings,
196             toml_edit::ser::ValueSerializer::new().serialize_i8(v),
197         )
198     }
199 
serialize_i16(self, v: i16) -> Result<Self::Ok, Self::Error>200     fn serialize_i16(self, v: i16) -> Result<Self::Ok, Self::Error> {
201         write_document(
202             self.dst,
203             self.settings,
204             toml_edit::ser::ValueSerializer::new().serialize_i16(v),
205         )
206     }
207 
serialize_i32(self, v: i32) -> Result<Self::Ok, Self::Error>208     fn serialize_i32(self, v: i32) -> Result<Self::Ok, Self::Error> {
209         write_document(
210             self.dst,
211             self.settings,
212             toml_edit::ser::ValueSerializer::new().serialize_i32(v),
213         )
214     }
215 
serialize_i64(self, v: i64) -> Result<Self::Ok, Self::Error>216     fn serialize_i64(self, v: i64) -> Result<Self::Ok, Self::Error> {
217         write_document(
218             self.dst,
219             self.settings,
220             toml_edit::ser::ValueSerializer::new().serialize_i64(v),
221         )
222     }
223 
serialize_u8(self, v: u8) -> Result<Self::Ok, Self::Error>224     fn serialize_u8(self, v: u8) -> Result<Self::Ok, Self::Error> {
225         write_document(
226             self.dst,
227             self.settings,
228             toml_edit::ser::ValueSerializer::new().serialize_u8(v),
229         )
230     }
231 
serialize_u16(self, v: u16) -> Result<Self::Ok, Self::Error>232     fn serialize_u16(self, v: u16) -> Result<Self::Ok, Self::Error> {
233         write_document(
234             self.dst,
235             self.settings,
236             toml_edit::ser::ValueSerializer::new().serialize_u16(v),
237         )
238     }
239 
serialize_u32(self, v: u32) -> Result<Self::Ok, Self::Error>240     fn serialize_u32(self, v: u32) -> Result<Self::Ok, Self::Error> {
241         write_document(
242             self.dst,
243             self.settings,
244             toml_edit::ser::ValueSerializer::new().serialize_u32(v),
245         )
246     }
247 
serialize_u64(self, v: u64) -> Result<Self::Ok, Self::Error>248     fn serialize_u64(self, v: u64) -> Result<Self::Ok, Self::Error> {
249         write_document(
250             self.dst,
251             self.settings,
252             toml_edit::ser::ValueSerializer::new().serialize_u64(v),
253         )
254     }
255 
serialize_f32(self, v: f32) -> Result<Self::Ok, Self::Error>256     fn serialize_f32(self, v: f32) -> Result<Self::Ok, Self::Error> {
257         write_document(
258             self.dst,
259             self.settings,
260             toml_edit::ser::ValueSerializer::new().serialize_f32(v),
261         )
262     }
263 
serialize_f64(self, v: f64) -> Result<Self::Ok, Self::Error>264     fn serialize_f64(self, v: f64) -> Result<Self::Ok, Self::Error> {
265         write_document(
266             self.dst,
267             self.settings,
268             toml_edit::ser::ValueSerializer::new().serialize_f64(v),
269         )
270     }
271 
serialize_char(self, v: char) -> Result<Self::Ok, Self::Error>272     fn serialize_char(self, v: char) -> Result<Self::Ok, Self::Error> {
273         write_document(
274             self.dst,
275             self.settings,
276             toml_edit::ser::ValueSerializer::new().serialize_char(v),
277         )
278     }
279 
serialize_str(self, v: &str) -> Result<Self::Ok, Self::Error>280     fn serialize_str(self, v: &str) -> Result<Self::Ok, Self::Error> {
281         write_document(
282             self.dst,
283             self.settings,
284             toml_edit::ser::ValueSerializer::new().serialize_str(v),
285         )
286     }
287 
serialize_bytes(self, v: &[u8]) -> Result<Self::Ok, Self::Error>288     fn serialize_bytes(self, v: &[u8]) -> Result<Self::Ok, Self::Error> {
289         write_document(
290             self.dst,
291             self.settings,
292             toml_edit::ser::ValueSerializer::new().serialize_bytes(v),
293         )
294     }
295 
serialize_none(self) -> Result<Self::Ok, Self::Error>296     fn serialize_none(self) -> Result<Self::Ok, Self::Error> {
297         write_document(
298             self.dst,
299             self.settings,
300             toml_edit::ser::ValueSerializer::new().serialize_none(),
301         )
302     }
303 
serialize_some<T: ?Sized>(self, v: &T) -> Result<Self::Ok, Self::Error> where T: serde::ser::Serialize,304     fn serialize_some<T: ?Sized>(self, v: &T) -> Result<Self::Ok, Self::Error>
305     where
306         T: serde::ser::Serialize,
307     {
308         write_document(
309             self.dst,
310             self.settings,
311             toml_edit::ser::ValueSerializer::new().serialize_some(v),
312         )
313     }
314 
serialize_unit(self) -> Result<Self::Ok, Self::Error>315     fn serialize_unit(self) -> Result<Self::Ok, Self::Error> {
316         write_document(
317             self.dst,
318             self.settings,
319             toml_edit::ser::ValueSerializer::new().serialize_unit(),
320         )
321     }
322 
serialize_unit_struct(self, name: &'static str) -> Result<Self::Ok, Self::Error>323     fn serialize_unit_struct(self, name: &'static str) -> Result<Self::Ok, Self::Error> {
324         write_document(
325             self.dst,
326             self.settings,
327             toml_edit::ser::ValueSerializer::new().serialize_unit_struct(name),
328         )
329     }
330 
serialize_unit_variant( self, name: &'static str, variant_index: u32, variant: &'static str, ) -> Result<Self::Ok, Self::Error>331     fn serialize_unit_variant(
332         self,
333         name: &'static str,
334         variant_index: u32,
335         variant: &'static str,
336     ) -> Result<Self::Ok, Self::Error> {
337         write_document(
338             self.dst,
339             self.settings,
340             toml_edit::ser::ValueSerializer::new().serialize_unit_variant(
341                 name,
342                 variant_index,
343                 variant,
344             ),
345         )
346     }
347 
serialize_newtype_struct<T: ?Sized>( self, name: &'static str, v: &T, ) -> Result<Self::Ok, Self::Error> where T: serde::ser::Serialize,348     fn serialize_newtype_struct<T: ?Sized>(
349         self,
350         name: &'static str,
351         v: &T,
352     ) -> Result<Self::Ok, Self::Error>
353     where
354         T: serde::ser::Serialize,
355     {
356         write_document(
357             self.dst,
358             self.settings,
359             toml_edit::ser::ValueSerializer::new().serialize_newtype_struct(name, v),
360         )
361     }
362 
serialize_newtype_variant<T: ?Sized>( self, name: &'static str, variant_index: u32, variant: &'static str, value: &T, ) -> Result<Self::Ok, Self::Error> where T: serde::ser::Serialize,363     fn serialize_newtype_variant<T: ?Sized>(
364         self,
365         name: &'static str,
366         variant_index: u32,
367         variant: &'static str,
368         value: &T,
369     ) -> Result<Self::Ok, Self::Error>
370     where
371         T: serde::ser::Serialize,
372     {
373         write_document(
374             self.dst,
375             self.settings,
376             toml_edit::ser::ValueSerializer::new().serialize_newtype_variant(
377                 name,
378                 variant_index,
379                 variant,
380                 value,
381             ),
382         )
383     }
384 
serialize_seq(self, len: Option<usize>) -> Result<Self::SerializeSeq, Self::Error>385     fn serialize_seq(self, len: Option<usize>) -> Result<Self::SerializeSeq, Self::Error> {
386         let ser = toml_edit::ser::ValueSerializer::new()
387             .serialize_seq(len)
388             .map_err(Error::wrap)?;
389         let ser = SerializeDocumentArray::new(self, ser);
390         Ok(ser)
391     }
392 
serialize_tuple(self, len: usize) -> Result<Self::SerializeTuple, Self::Error>393     fn serialize_tuple(self, len: usize) -> Result<Self::SerializeTuple, Self::Error> {
394         self.serialize_seq(Some(len))
395     }
396 
serialize_tuple_struct( self, _name: &'static str, len: usize, ) -> Result<Self::SerializeTupleStruct, Self::Error>397     fn serialize_tuple_struct(
398         self,
399         _name: &'static str,
400         len: usize,
401     ) -> Result<Self::SerializeTupleStruct, Self::Error> {
402         self.serialize_seq(Some(len))
403     }
404 
serialize_tuple_variant( self, _name: &'static str, _variant_index: u32, _variant: &'static str, len: usize, ) -> Result<Self::SerializeTupleVariant, Self::Error>405     fn serialize_tuple_variant(
406         self,
407         _name: &'static str,
408         _variant_index: u32,
409         _variant: &'static str,
410         len: usize,
411     ) -> Result<Self::SerializeTupleVariant, Self::Error> {
412         self.serialize_seq(Some(len))
413     }
414 
serialize_map(self, len: Option<usize>) -> Result<Self::SerializeMap, Self::Error>415     fn serialize_map(self, len: Option<usize>) -> Result<Self::SerializeMap, Self::Error> {
416         let ser = toml_edit::ser::ValueSerializer::new()
417             .serialize_map(len)
418             .map_err(Error::wrap)?;
419         let ser = SerializeDocumentTable::new(self, ser);
420         Ok(ser)
421     }
422 
serialize_struct( self, _name: &'static str, len: usize, ) -> Result<Self::SerializeStruct, Self::Error>423     fn serialize_struct(
424         self,
425         _name: &'static str,
426         len: usize,
427     ) -> Result<Self::SerializeStruct, Self::Error> {
428         self.serialize_map(Some(len))
429     }
430 
serialize_struct_variant( self, name: &'static str, _variant_index: u32, _variant: &'static str, _len: usize, ) -> Result<Self::SerializeStructVariant, Self::Error>431     fn serialize_struct_variant(
432         self,
433         name: &'static str,
434         _variant_index: u32,
435         _variant: &'static str,
436         _len: usize,
437     ) -> Result<Self::SerializeStructVariant, Self::Error> {
438         Err(Error::unsupported_type(Some(name)))
439     }
440 }
441 
442 /// Serialization for TOML [values][crate::Value].
443 ///
444 /// This structure implements serialization support for TOML to serialize an
445 /// arbitrary type to TOML. Note that the TOML format does not support all
446 /// datatypes in Rust, such as enums, tuples, and tuple structs. These types
447 /// will generate an error when serialized.
448 ///
449 /// Currently a serializer always writes its output to an in-memory `String`,
450 /// which is passed in when creating the serializer itself.
451 ///
452 /// # Examples
453 ///
454 /// ```
455 /// use serde::Serialize;
456 ///
457 /// #[derive(Serialize)]
458 /// struct Config {
459 ///     database: Database,
460 /// }
461 ///
462 /// #[derive(Serialize)]
463 /// struct Database {
464 ///     ip: String,
465 ///     port: Vec<u16>,
466 ///     connection_max: u32,
467 ///     enabled: bool,
468 /// }
469 ///
470 /// let config = Config {
471 ///     database: Database {
472 ///         ip: "192.168.1.1".to_string(),
473 ///         port: vec![8001, 8002, 8003],
474 ///         connection_max: 5000,
475 ///         enabled: false,
476 ///     },
477 /// };
478 ///
479 /// let mut value = String::new();
480 /// serde::Serialize::serialize(
481 ///     &config,
482 ///     toml::ser::ValueSerializer::new(&mut value)
483 /// ).unwrap();
484 /// println!("{}", value)
485 /// ```
486 #[non_exhaustive]
487 #[cfg(feature = "display")]
488 pub struct ValueSerializer<'d> {
489     dst: &'d mut String,
490 }
491 
492 #[cfg(feature = "display")]
493 impl<'d> ValueSerializer<'d> {
494     /// Creates a new serializer which will emit TOML into the buffer provided.
495     ///
496     /// The serializer can then be used to serialize a type after which the data
497     /// will be present in `dst`.
new(dst: &'d mut String) -> Self498     pub fn new(dst: &'d mut String) -> Self {
499         Self { dst }
500     }
501 }
502 
503 #[cfg(feature = "display")]
504 impl<'d> serde::ser::Serializer for ValueSerializer<'d> {
505     type Ok = ();
506     type Error = Error;
507     type SerializeSeq = SerializeValueArray<'d>;
508     type SerializeTuple = SerializeValueArray<'d>;
509     type SerializeTupleStruct = SerializeValueArray<'d>;
510     type SerializeTupleVariant = SerializeValueArray<'d>;
511     type SerializeMap = SerializeValueTable<'d>;
512     type SerializeStruct = SerializeValueTable<'d>;
513     type SerializeStructVariant = serde::ser::Impossible<Self::Ok, Self::Error>;
514 
serialize_bool(self, v: bool) -> Result<Self::Ok, Self::Error>515     fn serialize_bool(self, v: bool) -> Result<Self::Ok, Self::Error> {
516         write_value(
517             self.dst,
518             toml_edit::ser::ValueSerializer::new().serialize_bool(v),
519         )
520     }
521 
serialize_i8(self, v: i8) -> Result<Self::Ok, Self::Error>522     fn serialize_i8(self, v: i8) -> Result<Self::Ok, Self::Error> {
523         write_value(
524             self.dst,
525             toml_edit::ser::ValueSerializer::new().serialize_i8(v),
526         )
527     }
528 
serialize_i16(self, v: i16) -> Result<Self::Ok, Self::Error>529     fn serialize_i16(self, v: i16) -> Result<Self::Ok, Self::Error> {
530         write_value(
531             self.dst,
532             toml_edit::ser::ValueSerializer::new().serialize_i16(v),
533         )
534     }
535 
serialize_i32(self, v: i32) -> Result<Self::Ok, Self::Error>536     fn serialize_i32(self, v: i32) -> Result<Self::Ok, Self::Error> {
537         write_value(
538             self.dst,
539             toml_edit::ser::ValueSerializer::new().serialize_i32(v),
540         )
541     }
542 
serialize_i64(self, v: i64) -> Result<Self::Ok, Self::Error>543     fn serialize_i64(self, v: i64) -> Result<Self::Ok, Self::Error> {
544         write_value(
545             self.dst,
546             toml_edit::ser::ValueSerializer::new().serialize_i64(v),
547         )
548     }
549 
serialize_u8(self, v: u8) -> Result<Self::Ok, Self::Error>550     fn serialize_u8(self, v: u8) -> Result<Self::Ok, Self::Error> {
551         write_value(
552             self.dst,
553             toml_edit::ser::ValueSerializer::new().serialize_u8(v),
554         )
555     }
556 
serialize_u16(self, v: u16) -> Result<Self::Ok, Self::Error>557     fn serialize_u16(self, v: u16) -> Result<Self::Ok, Self::Error> {
558         write_value(
559             self.dst,
560             toml_edit::ser::ValueSerializer::new().serialize_u16(v),
561         )
562     }
563 
serialize_u32(self, v: u32) -> Result<Self::Ok, Self::Error>564     fn serialize_u32(self, v: u32) -> Result<Self::Ok, Self::Error> {
565         write_value(
566             self.dst,
567             toml_edit::ser::ValueSerializer::new().serialize_u32(v),
568         )
569     }
570 
serialize_u64(self, v: u64) -> Result<Self::Ok, Self::Error>571     fn serialize_u64(self, v: u64) -> Result<Self::Ok, Self::Error> {
572         write_value(
573             self.dst,
574             toml_edit::ser::ValueSerializer::new().serialize_u64(v),
575         )
576     }
577 
serialize_f32(self, v: f32) -> Result<Self::Ok, Self::Error>578     fn serialize_f32(self, v: f32) -> Result<Self::Ok, Self::Error> {
579         write_value(
580             self.dst,
581             toml_edit::ser::ValueSerializer::new().serialize_f32(v),
582         )
583     }
584 
serialize_f64(self, v: f64) -> Result<Self::Ok, Self::Error>585     fn serialize_f64(self, v: f64) -> Result<Self::Ok, Self::Error> {
586         write_value(
587             self.dst,
588             toml_edit::ser::ValueSerializer::new().serialize_f64(v),
589         )
590     }
591 
serialize_char(self, v: char) -> Result<Self::Ok, Self::Error>592     fn serialize_char(self, v: char) -> Result<Self::Ok, Self::Error> {
593         write_value(
594             self.dst,
595             toml_edit::ser::ValueSerializer::new().serialize_char(v),
596         )
597     }
598 
serialize_str(self, v: &str) -> Result<Self::Ok, Self::Error>599     fn serialize_str(self, v: &str) -> Result<Self::Ok, Self::Error> {
600         write_value(
601             self.dst,
602             toml_edit::ser::ValueSerializer::new().serialize_str(v),
603         )
604     }
605 
serialize_bytes(self, v: &[u8]) -> Result<Self::Ok, Self::Error>606     fn serialize_bytes(self, v: &[u8]) -> Result<Self::Ok, Self::Error> {
607         write_value(
608             self.dst,
609             toml_edit::ser::ValueSerializer::new().serialize_bytes(v),
610         )
611     }
612 
serialize_none(self) -> Result<Self::Ok, Self::Error>613     fn serialize_none(self) -> Result<Self::Ok, Self::Error> {
614         write_value(
615             self.dst,
616             toml_edit::ser::ValueSerializer::new().serialize_none(),
617         )
618     }
619 
serialize_some<T: ?Sized>(self, v: &T) -> Result<Self::Ok, Self::Error> where T: serde::ser::Serialize,620     fn serialize_some<T: ?Sized>(self, v: &T) -> Result<Self::Ok, Self::Error>
621     where
622         T: serde::ser::Serialize,
623     {
624         write_value(
625             self.dst,
626             toml_edit::ser::ValueSerializer::new().serialize_some(v),
627         )
628     }
629 
serialize_unit(self) -> Result<Self::Ok, Self::Error>630     fn serialize_unit(self) -> Result<Self::Ok, Self::Error> {
631         write_value(
632             self.dst,
633             toml_edit::ser::ValueSerializer::new().serialize_unit(),
634         )
635     }
636 
serialize_unit_struct(self, name: &'static str) -> Result<Self::Ok, Self::Error>637     fn serialize_unit_struct(self, name: &'static str) -> Result<Self::Ok, Self::Error> {
638         write_value(
639             self.dst,
640             toml_edit::ser::ValueSerializer::new().serialize_unit_struct(name),
641         )
642     }
643 
serialize_unit_variant( self, name: &'static str, variant_index: u32, variant: &'static str, ) -> Result<Self::Ok, Self::Error>644     fn serialize_unit_variant(
645         self,
646         name: &'static str,
647         variant_index: u32,
648         variant: &'static str,
649     ) -> Result<Self::Ok, Self::Error> {
650         write_value(
651             self.dst,
652             toml_edit::ser::ValueSerializer::new().serialize_unit_variant(
653                 name,
654                 variant_index,
655                 variant,
656             ),
657         )
658     }
659 
serialize_newtype_struct<T: ?Sized>( self, name: &'static str, v: &T, ) -> Result<Self::Ok, Self::Error> where T: serde::ser::Serialize,660     fn serialize_newtype_struct<T: ?Sized>(
661         self,
662         name: &'static str,
663         v: &T,
664     ) -> Result<Self::Ok, Self::Error>
665     where
666         T: serde::ser::Serialize,
667     {
668         write_value(
669             self.dst,
670             toml_edit::ser::ValueSerializer::new().serialize_newtype_struct(name, v),
671         )
672     }
673 
serialize_newtype_variant<T: ?Sized>( self, name: &'static str, variant_index: u32, variant: &'static str, value: &T, ) -> Result<Self::Ok, Self::Error> where T: serde::ser::Serialize,674     fn serialize_newtype_variant<T: ?Sized>(
675         self,
676         name: &'static str,
677         variant_index: u32,
678         variant: &'static str,
679         value: &T,
680     ) -> Result<Self::Ok, Self::Error>
681     where
682         T: serde::ser::Serialize,
683     {
684         write_value(
685             self.dst,
686             toml_edit::ser::ValueSerializer::new().serialize_newtype_variant(
687                 name,
688                 variant_index,
689                 variant,
690                 value,
691             ),
692         )
693     }
694 
serialize_seq(self, len: Option<usize>) -> Result<Self::SerializeSeq, Self::Error>695     fn serialize_seq(self, len: Option<usize>) -> Result<Self::SerializeSeq, Self::Error> {
696         let ser = toml_edit::ser::ValueSerializer::new()
697             .serialize_seq(len)
698             .map_err(Error::wrap)?;
699         let ser = SerializeValueArray::new(self, ser);
700         Ok(ser)
701     }
702 
serialize_tuple(self, len: usize) -> Result<Self::SerializeTuple, Self::Error>703     fn serialize_tuple(self, len: usize) -> Result<Self::SerializeTuple, Self::Error> {
704         self.serialize_seq(Some(len))
705     }
706 
serialize_tuple_struct( self, _name: &'static str, len: usize, ) -> Result<Self::SerializeTupleStruct, Self::Error>707     fn serialize_tuple_struct(
708         self,
709         _name: &'static str,
710         len: usize,
711     ) -> Result<Self::SerializeTupleStruct, Self::Error> {
712         self.serialize_seq(Some(len))
713     }
714 
serialize_tuple_variant( self, _name: &'static str, _variant_index: u32, _variant: &'static str, len: usize, ) -> Result<Self::SerializeTupleVariant, Self::Error>715     fn serialize_tuple_variant(
716         self,
717         _name: &'static str,
718         _variant_index: u32,
719         _variant: &'static str,
720         len: usize,
721     ) -> Result<Self::SerializeTupleVariant, Self::Error> {
722         self.serialize_seq(Some(len))
723     }
724 
serialize_map(self, len: Option<usize>) -> Result<Self::SerializeMap, Self::Error>725     fn serialize_map(self, len: Option<usize>) -> Result<Self::SerializeMap, Self::Error> {
726         let ser = toml_edit::ser::ValueSerializer::new()
727             .serialize_map(len)
728             .map_err(Error::wrap)?;
729         let ser = SerializeValueTable::new(self, ser);
730         Ok(ser)
731     }
732 
serialize_struct( self, _name: &'static str, len: usize, ) -> Result<Self::SerializeStruct, Self::Error>733     fn serialize_struct(
734         self,
735         _name: &'static str,
736         len: usize,
737     ) -> Result<Self::SerializeStruct, Self::Error> {
738         self.serialize_map(Some(len))
739     }
740 
serialize_struct_variant( self, name: &'static str, _variant_index: u32, _variant: &'static str, _len: usize, ) -> Result<Self::SerializeStructVariant, Self::Error>741     fn serialize_struct_variant(
742         self,
743         name: &'static str,
744         _variant_index: u32,
745         _variant: &'static str,
746         _len: usize,
747     ) -> Result<Self::SerializeStructVariant, Self::Error> {
748         Err(Error::unsupported_type(Some(name)))
749     }
750 }
751 
752 #[cfg(feature = "display")]
753 use internal::*;
754 
755 #[cfg(feature = "display")]
756 mod internal {
757     use super::*;
758 
759     use crate::fmt::DocumentFormatter;
760 
761     type InnerSerializeDocumentSeq =
762         <toml_edit::ser::ValueSerializer as serde::Serializer>::SerializeSeq;
763 
764     #[doc(hidden)]
765     pub struct SerializeDocumentArray<'d> {
766         inner: InnerSerializeDocumentSeq,
767         dst: &'d mut String,
768         settings: DocumentFormatter,
769     }
770 
771     impl<'d> SerializeDocumentArray<'d> {
new(ser: Serializer<'d>, inner: InnerSerializeDocumentSeq) -> Self772         pub(crate) fn new(ser: Serializer<'d>, inner: InnerSerializeDocumentSeq) -> Self {
773             Self {
774                 inner,
775                 dst: ser.dst,
776                 settings: ser.settings,
777             }
778         }
779     }
780 
781     impl<'d> serde::ser::SerializeSeq for SerializeDocumentArray<'d> {
782         type Ok = ();
783         type Error = Error;
784 
serialize_element<T: ?Sized>(&mut self, value: &T) -> Result<(), Error> where T: serde::ser::Serialize,785         fn serialize_element<T: ?Sized>(&mut self, value: &T) -> Result<(), Error>
786         where
787             T: serde::ser::Serialize,
788         {
789             self.inner.serialize_element(value).map_err(Error::wrap)
790         }
791 
end(self) -> Result<Self::Ok, Self::Error>792         fn end(self) -> Result<Self::Ok, Self::Error> {
793             write_document(self.dst, self.settings, self.inner.end())
794         }
795     }
796 
797     impl<'d> serde::ser::SerializeTuple for SerializeDocumentArray<'d> {
798         type Ok = ();
799         type Error = Error;
800 
serialize_element<T: ?Sized>(&mut self, value: &T) -> Result<(), Error> where T: serde::ser::Serialize,801         fn serialize_element<T: ?Sized>(&mut self, value: &T) -> Result<(), Error>
802         where
803             T: serde::ser::Serialize,
804         {
805             self.inner.serialize_element(value).map_err(Error::wrap)
806         }
807 
end(self) -> Result<Self::Ok, Self::Error>808         fn end(self) -> Result<Self::Ok, Self::Error> {
809             write_document(self.dst, self.settings, self.inner.end())
810         }
811     }
812 
813     impl<'d> serde::ser::SerializeTupleVariant for SerializeDocumentArray<'d> {
814         type Ok = ();
815         type Error = Error;
816 
serialize_field<T: ?Sized>(&mut self, value: &T) -> Result<(), Error> where T: serde::ser::Serialize,817         fn serialize_field<T: ?Sized>(&mut self, value: &T) -> Result<(), Error>
818         where
819             T: serde::ser::Serialize,
820         {
821             self.inner.serialize_field(value).map_err(Error::wrap)
822         }
823 
end(self) -> Result<Self::Ok, Self::Error>824         fn end(self) -> Result<Self::Ok, Self::Error> {
825             write_document(self.dst, self.settings, self.inner.end())
826         }
827     }
828 
829     impl<'d> serde::ser::SerializeTupleStruct for SerializeDocumentArray<'d> {
830         type Ok = ();
831         type Error = Error;
832 
serialize_field<T: ?Sized>(&mut self, value: &T) -> Result<(), Error> where T: serde::ser::Serialize,833         fn serialize_field<T: ?Sized>(&mut self, value: &T) -> Result<(), Error>
834         where
835             T: serde::ser::Serialize,
836         {
837             self.inner.serialize_field(value).map_err(Error::wrap)
838         }
839 
end(self) -> Result<Self::Ok, Self::Error>840         fn end(self) -> Result<Self::Ok, Self::Error> {
841             write_document(self.dst, self.settings, self.inner.end())
842         }
843     }
844 
845     type InnerSerializeDocumentTable =
846         <toml_edit::ser::ValueSerializer as serde::Serializer>::SerializeMap;
847 
848     #[doc(hidden)]
849     pub struct SerializeDocumentTable<'d> {
850         inner: InnerSerializeDocumentTable,
851         dst: &'d mut String,
852         settings: DocumentFormatter,
853     }
854 
855     impl<'d> SerializeDocumentTable<'d> {
new(ser: Serializer<'d>, inner: InnerSerializeDocumentTable) -> Self856         pub(crate) fn new(ser: Serializer<'d>, inner: InnerSerializeDocumentTable) -> Self {
857             Self {
858                 inner,
859                 dst: ser.dst,
860                 settings: ser.settings,
861             }
862         }
863     }
864 
865     impl<'d> serde::ser::SerializeMap for SerializeDocumentTable<'d> {
866         type Ok = ();
867         type Error = Error;
868 
serialize_key<T: ?Sized>(&mut self, input: &T) -> Result<(), Self::Error> where T: serde::ser::Serialize,869         fn serialize_key<T: ?Sized>(&mut self, input: &T) -> Result<(), Self::Error>
870         where
871             T: serde::ser::Serialize,
872         {
873             self.inner.serialize_key(input).map_err(Error::wrap)
874         }
875 
serialize_value<T: ?Sized>(&mut self, value: &T) -> Result<(), Self::Error> where T: serde::ser::Serialize,876         fn serialize_value<T: ?Sized>(&mut self, value: &T) -> Result<(), Self::Error>
877         where
878             T: serde::ser::Serialize,
879         {
880             self.inner.serialize_value(value).map_err(Error::wrap)
881         }
882 
end(self) -> Result<Self::Ok, Self::Error>883         fn end(self) -> Result<Self::Ok, Self::Error> {
884             write_document(self.dst, self.settings, self.inner.end())
885         }
886     }
887 
888     impl<'d> serde::ser::SerializeStruct for SerializeDocumentTable<'d> {
889         type Ok = ();
890         type Error = Error;
891 
serialize_field<T: ?Sized>( &mut self, key: &'static str, value: &T, ) -> Result<(), Self::Error> where T: serde::ser::Serialize,892         fn serialize_field<T: ?Sized>(
893             &mut self,
894             key: &'static str,
895             value: &T,
896         ) -> Result<(), Self::Error>
897         where
898             T: serde::ser::Serialize,
899         {
900             self.inner.serialize_field(key, value).map_err(Error::wrap)
901         }
902 
end(self) -> Result<Self::Ok, Self::Error>903         fn end(self) -> Result<Self::Ok, Self::Error> {
904             write_document(self.dst, self.settings, self.inner.end())
905         }
906     }
907 
write_document( dst: &mut String, mut settings: DocumentFormatter, value: Result<toml_edit::Value, crate::edit::ser::Error>, ) -> Result<(), Error>908     pub(crate) fn write_document(
909         dst: &mut String,
910         mut settings: DocumentFormatter,
911         value: Result<toml_edit::Value, crate::edit::ser::Error>,
912     ) -> Result<(), Error> {
913         use std::fmt::Write;
914 
915         let value = value.map_err(Error::wrap)?;
916         let mut table = match toml_edit::Item::Value(value).into_table() {
917             Ok(i) => i,
918             Err(_) => {
919                 return Err(Error::unsupported_type(None));
920             }
921         };
922 
923         use toml_edit::visit_mut::VisitMut as _;
924         settings.visit_table_mut(&mut table);
925 
926         let doc: toml_edit::Document = table.into();
927         write!(dst, "{}", doc).unwrap();
928 
929         Ok(())
930     }
931 
932     type InnerSerializeValueSeq =
933         <toml_edit::ser::ValueSerializer as serde::Serializer>::SerializeSeq;
934 
935     #[doc(hidden)]
936     pub struct SerializeValueArray<'d> {
937         inner: InnerSerializeValueSeq,
938         dst: &'d mut String,
939     }
940 
941     impl<'d> SerializeValueArray<'d> {
new(ser: ValueSerializer<'d>, inner: InnerSerializeValueSeq) -> Self942         pub(crate) fn new(ser: ValueSerializer<'d>, inner: InnerSerializeValueSeq) -> Self {
943             Self {
944                 inner,
945                 dst: ser.dst,
946             }
947         }
948     }
949 
950     impl<'d> serde::ser::SerializeSeq for SerializeValueArray<'d> {
951         type Ok = ();
952         type Error = Error;
953 
serialize_element<T: ?Sized>(&mut self, value: &T) -> Result<(), Error> where T: serde::ser::Serialize,954         fn serialize_element<T: ?Sized>(&mut self, value: &T) -> Result<(), Error>
955         where
956             T: serde::ser::Serialize,
957         {
958             self.inner.serialize_element(value).map_err(Error::wrap)
959         }
960 
end(self) -> Result<Self::Ok, Self::Error>961         fn end(self) -> Result<Self::Ok, Self::Error> {
962             write_value(self.dst, self.inner.end())
963         }
964     }
965 
966     impl<'d> serde::ser::SerializeTuple for SerializeValueArray<'d> {
967         type Ok = ();
968         type Error = Error;
969 
serialize_element<T: ?Sized>(&mut self, value: &T) -> Result<(), Error> where T: serde::ser::Serialize,970         fn serialize_element<T: ?Sized>(&mut self, value: &T) -> Result<(), Error>
971         where
972             T: serde::ser::Serialize,
973         {
974             self.inner.serialize_element(value).map_err(Error::wrap)
975         }
976 
end(self) -> Result<Self::Ok, Self::Error>977         fn end(self) -> Result<Self::Ok, Self::Error> {
978             write_value(self.dst, self.inner.end())
979         }
980     }
981 
982     impl<'d> serde::ser::SerializeTupleVariant for SerializeValueArray<'d> {
983         type Ok = ();
984         type Error = Error;
985 
serialize_field<T: ?Sized>(&mut self, value: &T) -> Result<(), Error> where T: serde::ser::Serialize,986         fn serialize_field<T: ?Sized>(&mut self, value: &T) -> Result<(), Error>
987         where
988             T: serde::ser::Serialize,
989         {
990             self.inner.serialize_field(value).map_err(Error::wrap)
991         }
992 
end(self) -> Result<Self::Ok, Self::Error>993         fn end(self) -> Result<Self::Ok, Self::Error> {
994             write_value(self.dst, self.inner.end())
995         }
996     }
997 
998     impl<'d> serde::ser::SerializeTupleStruct for SerializeValueArray<'d> {
999         type Ok = ();
1000         type Error = Error;
1001 
serialize_field<T: ?Sized>(&mut self, value: &T) -> Result<(), Error> where T: serde::ser::Serialize,1002         fn serialize_field<T: ?Sized>(&mut self, value: &T) -> Result<(), Error>
1003         where
1004             T: serde::ser::Serialize,
1005         {
1006             self.inner.serialize_field(value).map_err(Error::wrap)
1007         }
1008 
end(self) -> Result<Self::Ok, Self::Error>1009         fn end(self) -> Result<Self::Ok, Self::Error> {
1010             write_value(self.dst, self.inner.end())
1011         }
1012     }
1013 
1014     type InnerSerializeValueTable =
1015         <toml_edit::ser::ValueSerializer as serde::Serializer>::SerializeMap;
1016 
1017     #[doc(hidden)]
1018     pub struct SerializeValueTable<'d> {
1019         inner: InnerSerializeValueTable,
1020         dst: &'d mut String,
1021     }
1022 
1023     impl<'d> SerializeValueTable<'d> {
new(ser: ValueSerializer<'d>, inner: InnerSerializeValueTable) -> Self1024         pub(crate) fn new(ser: ValueSerializer<'d>, inner: InnerSerializeValueTable) -> Self {
1025             Self {
1026                 inner,
1027                 dst: ser.dst,
1028             }
1029         }
1030     }
1031 
1032     impl<'d> serde::ser::SerializeMap for SerializeValueTable<'d> {
1033         type Ok = ();
1034         type Error = Error;
1035 
serialize_key<T: ?Sized>(&mut self, input: &T) -> Result<(), Self::Error> where T: serde::ser::Serialize,1036         fn serialize_key<T: ?Sized>(&mut self, input: &T) -> Result<(), Self::Error>
1037         where
1038             T: serde::ser::Serialize,
1039         {
1040             self.inner.serialize_key(input).map_err(Error::wrap)
1041         }
1042 
serialize_value<T: ?Sized>(&mut self, value: &T) -> Result<(), Self::Error> where T: serde::ser::Serialize,1043         fn serialize_value<T: ?Sized>(&mut self, value: &T) -> Result<(), Self::Error>
1044         where
1045             T: serde::ser::Serialize,
1046         {
1047             self.inner.serialize_value(value).map_err(Error::wrap)
1048         }
1049 
end(self) -> Result<Self::Ok, Self::Error>1050         fn end(self) -> Result<Self::Ok, Self::Error> {
1051             write_value(self.dst, self.inner.end())
1052         }
1053     }
1054 
1055     impl<'d> serde::ser::SerializeStruct for SerializeValueTable<'d> {
1056         type Ok = ();
1057         type Error = Error;
1058 
serialize_field<T: ?Sized>( &mut self, key: &'static str, value: &T, ) -> Result<(), Self::Error> where T: serde::ser::Serialize,1059         fn serialize_field<T: ?Sized>(
1060             &mut self,
1061             key: &'static str,
1062             value: &T,
1063         ) -> Result<(), Self::Error>
1064         where
1065             T: serde::ser::Serialize,
1066         {
1067             self.inner.serialize_field(key, value).map_err(Error::wrap)
1068         }
1069 
end(self) -> Result<Self::Ok, Self::Error>1070         fn end(self) -> Result<Self::Ok, Self::Error> {
1071             write_value(self.dst, self.inner.end())
1072         }
1073     }
1074 
write_value( dst: &mut String, value: Result<toml_edit::Value, crate::edit::ser::Error>, ) -> Result<(), Error>1075     pub(crate) fn write_value(
1076         dst: &mut String,
1077         value: Result<toml_edit::Value, crate::edit::ser::Error>,
1078     ) -> Result<(), Error> {
1079         use std::fmt::Write;
1080 
1081         let value = value.map_err(Error::wrap)?;
1082 
1083         write!(dst, "{}", value).unwrap();
1084 
1085         Ok(())
1086     }
1087 }
1088