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