Coverage Report

Created: 2026-06-02 06:27

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/rust/registry/src/index.crates.io-1949cf8c6b5b557f/serde-1.0.152/src/ser/mod.rs
Line
Count
Source
1
//! Generic data structure serialization framework.
2
//!
3
//! The two most important traits in this module are [`Serialize`] and
4
//! [`Serializer`].
5
//!
6
//!  - **A type that implements `Serialize` is a data structure** that can be
7
//!    serialized to any data format supported by Serde, and conversely
8
//!  - **A type that implements `Serializer` is a data format** that can
9
//!    serialize any data structure supported by Serde.
10
//!
11
//! # The Serialize trait
12
//!
13
//! Serde provides [`Serialize`] implementations for many Rust primitive and
14
//! standard library types. The complete list is below. All of these can be
15
//! serialized using Serde out of the box.
16
//!
17
//! Additionally, Serde provides a procedural macro called [`serde_derive`] to
18
//! automatically generate [`Serialize`] implementations for structs and enums
19
//! in your program. See the [derive section of the manual] for how to use this.
20
//!
21
//! In rare cases it may be necessary to implement [`Serialize`] manually for
22
//! some type in your program. See the [Implementing `Serialize`] section of the
23
//! manual for more about this.
24
//!
25
//! Third-party crates may provide [`Serialize`] implementations for types that
26
//! they expose. For example the [`linked-hash-map`] crate provides a
27
//! [`LinkedHashMap<K, V>`] type that is serializable by Serde because the crate
28
//! provides an implementation of [`Serialize`] for it.
29
//!
30
//! # The Serializer trait
31
//!
32
//! [`Serializer`] implementations are provided by third-party crates, for
33
//! example [`serde_json`], [`serde_yaml`] and [`postcard`].
34
//!
35
//! A partial list of well-maintained formats is given on the [Serde
36
//! website][data formats].
37
//!
38
//! # Implementations of Serialize provided by Serde
39
//!
40
//!  - **Primitive types**:
41
//!    - bool
42
//!    - i8, i16, i32, i64, i128, isize
43
//!    - u8, u16, u32, u64, u128, usize
44
//!    - f32, f64
45
//!    - char
46
//!    - str
47
//!    - &T and &mut T
48
//!  - **Compound types**:
49
//!    - \[T\]
50
//!    - \[T; 0\] through \[T; 32\]
51
//!    - tuples up to size 16
52
//!  - **Common standard library types**:
53
//!    - String
54
//!    - Option\<T\>
55
//!    - Result\<T, E\>
56
//!    - PhantomData\<T\>
57
//!  - **Wrapper types**:
58
//!    - Box\<T\>
59
//!    - Cow\<'a, T\>
60
//!    - Cell\<T\>
61
//!    - RefCell\<T\>
62
//!    - Mutex\<T\>
63
//!    - RwLock\<T\>
64
//!    - Rc\<T\>&emsp;*(if* features = ["rc"] *is enabled)*
65
//!    - Arc\<T\>&emsp;*(if* features = ["rc"] *is enabled)*
66
//!  - **Collection types**:
67
//!    - BTreeMap\<K, V\>
68
//!    - BTreeSet\<T\>
69
//!    - BinaryHeap\<T\>
70
//!    - HashMap\<K, V, H\>
71
//!    - HashSet\<T, H\>
72
//!    - LinkedList\<T\>
73
//!    - VecDeque\<T\>
74
//!    - Vec\<T\>
75
//!  - **FFI types**:
76
//!    - CStr
77
//!    - CString
78
//!    - OsStr
79
//!    - OsString
80
//!  - **Miscellaneous standard library types**:
81
//!    - Duration
82
//!    - SystemTime
83
//!    - Path
84
//!    - PathBuf
85
//!    - Range\<T\>
86
//!    - RangeInclusive\<T\>
87
//!    - Bound\<T\>
88
//!    - num::NonZero*
89
//!    - `!` *(unstable)*
90
//!  - **Net types**:
91
//!    - IpAddr
92
//!    - Ipv4Addr
93
//!    - Ipv6Addr
94
//!    - SocketAddr
95
//!    - SocketAddrV4
96
//!    - SocketAddrV6
97
//!
98
//! [Implementing `Serialize`]: https://serde.rs/impl-serialize.html
99
//! [`LinkedHashMap<K, V>`]: https://docs.rs/linked-hash-map/*/linked_hash_map/struct.LinkedHashMap.html
100
//! [`Serialize`]: ../trait.Serialize.html
101
//! [`Serializer`]: ../trait.Serializer.html
102
//! [`postcard`]: https://github.com/jamesmunns/postcard
103
//! [`linked-hash-map`]: https://crates.io/crates/linked-hash-map
104
//! [`serde_derive`]: https://crates.io/crates/serde_derive
105
//! [`serde_json`]: https://github.com/serde-rs/json
106
//! [`serde_yaml`]: https://github.com/dtolnay/serde-yaml
107
//! [derive section of the manual]: https://serde.rs/derive.html
108
//! [data formats]: https://serde.rs/#data-formats
109
110
use lib::*;
111
112
mod fmt;
113
mod impls;
114
mod impossible;
115
116
pub use self::impossible::Impossible;
117
118
#[cfg(all(feature = "unstable", not(feature = "std")))]
119
#[doc(inline)]
120
pub use core::error::Error as StdError;
121
#[cfg(feature = "std")]
122
#[doc(no_inline)]
123
pub use std::error::Error as StdError;
124
#[cfg(not(any(feature = "std", feature = "unstable")))]
125
#[doc(no_inline)]
126
pub use std_error::Error as StdError;
127
128
////////////////////////////////////////////////////////////////////////////////
129
130
macro_rules! declare_error_trait {
131
    (Error: Sized $(+ $($supertrait:ident)::+)*) => {
132
        /// Trait used by `Serialize` implementations to generically construct
133
        /// errors belonging to the `Serializer` against which they are
134
        /// currently running.
135
        ///
136
        /// # Example implementation
137
        ///
138
        /// The [example data format] presented on the website shows an error
139
        /// type appropriate for a basic JSON data format.
140
        ///
141
        /// [example data format]: https://serde.rs/data-format.html
142
        pub trait Error: Sized $(+ $($supertrait)::+)* {
143
            /// Used when a [`Serialize`] implementation encounters any error
144
            /// while serializing a type.
145
            ///
146
            /// The message should not be capitalized and should not end with a
147
            /// period.
148
            ///
149
            /// For example, a filesystem [`Path`] may refuse to serialize
150
            /// itself if it contains invalid UTF-8 data.
151
            ///
152
            /// ```edition2018
153
            /// # struct Path;
154
            /// #
155
            /// # impl Path {
156
            /// #     fn to_str(&self) -> Option<&str> {
157
            /// #         unimplemented!()
158
            /// #     }
159
            /// # }
160
            /// #
161
            /// use serde::ser::{self, Serialize, Serializer};
162
            ///
163
            /// impl Serialize for Path {
164
            ///     fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
165
            ///     where
166
            ///         S: Serializer,
167
            ///     {
168
            ///         match self.to_str() {
169
            ///             Some(s) => serializer.serialize_str(s),
170
            ///             None => Err(ser::Error::custom("path contains invalid UTF-8 characters")),
171
            ///         }
172
            ///     }
173
            /// }
174
            /// ```
175
            ///
176
            /// [`Path`]: https://doc.rust-lang.org/std/path/struct.Path.html
177
            /// [`Serialize`]: ../trait.Serialize.html
178
            fn custom<T>(msg: T) -> Self
179
            where
180
                T: Display;
181
        }
182
    }
183
}
184
185
#[cfg(feature = "std")]
186
declare_error_trait!(Error: Sized + StdError);
187
188
#[cfg(not(feature = "std"))]
189
declare_error_trait!(Error: Sized + Debug + Display);
190
191
////////////////////////////////////////////////////////////////////////////////
192
193
/// A **data structure** that can be serialized into any data format supported
194
/// by Serde.
195
///
196
/// Serde provides `Serialize` implementations for many Rust primitive and
197
/// standard library types. The complete list is [here][crate::ser]. All of
198
/// these can be serialized using Serde out of the box.
199
///
200
/// Additionally, Serde provides a procedural macro called [`serde_derive`] to
201
/// automatically generate `Serialize` implementations for structs and enums in
202
/// your program. See the [derive section of the manual] for how to use this.
203
///
204
/// In rare cases it may be necessary to implement `Serialize` manually for some
205
/// type in your program. See the [Implementing `Serialize`] section of the
206
/// manual for more about this.
207
///
208
/// Third-party crates may provide `Serialize` implementations for types that
209
/// they expose. For example the [`linked-hash-map`] crate provides a
210
/// [`LinkedHashMap<K, V>`] type that is serializable by Serde because the crate
211
/// provides an implementation of `Serialize` for it.
212
///
213
/// [Implementing `Serialize`]: https://serde.rs/impl-serialize.html
214
/// [`LinkedHashMap<K, V>`]: https://docs.rs/linked-hash-map/*/linked_hash_map/struct.LinkedHashMap.html
215
/// [`linked-hash-map`]: https://crates.io/crates/linked-hash-map
216
/// [`serde_derive`]: https://crates.io/crates/serde_derive
217
/// [derive section of the manual]: https://serde.rs/derive.html
218
pub trait Serialize {
219
    /// Serialize this value into the given Serde serializer.
220
    ///
221
    /// See the [Implementing `Serialize`] section of the manual for more
222
    /// information about how to implement this method.
223
    ///
224
    /// ```edition2018
225
    /// use serde::ser::{Serialize, SerializeStruct, Serializer};
226
    ///
227
    /// struct Person {
228
    ///     name: String,
229
    ///     age: u8,
230
    ///     phones: Vec<String>,
231
    /// }
232
    ///
233
    /// // This is what #[derive(Serialize)] would generate.
234
    /// impl Serialize for Person {
235
    ///     fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
236
    ///     where
237
    ///         S: Serializer,
238
    ///     {
239
    ///         let mut s = serializer.serialize_struct("Person", 3)?;
240
    ///         s.serialize_field("name", &self.name)?;
241
    ///         s.serialize_field("age", &self.age)?;
242
    ///         s.serialize_field("phones", &self.phones)?;
243
    ///         s.end()
244
    ///     }
245
    /// }
246
    /// ```
247
    ///
248
    /// [Implementing `Serialize`]: https://serde.rs/impl-serialize.html
249
    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
250
    where
251
        S: Serializer;
252
}
253
254
////////////////////////////////////////////////////////////////////////////////
255
256
/// A **data format** that can serialize any data structure supported by Serde.
257
///
258
/// The role of this trait is to define the serialization half of the [Serde
259
/// data model], which is a way to categorize every Rust data structure into one
260
/// of 29 possible types. Each method of the `Serializer` trait corresponds to
261
/// one of the types of the data model.
262
///
263
/// Implementations of `Serialize` map themselves into this data model by
264
/// invoking exactly one of the `Serializer` methods.
265
///
266
/// The types that make up the Serde data model are:
267
///
268
///  - **14 primitive types**
269
///    - bool
270
///    - i8, i16, i32, i64, i128
271
///    - u8, u16, u32, u64, u128
272
///    - f32, f64
273
///    - char
274
///  - **string**
275
///    - UTF-8 bytes with a length and no null terminator.
276
///    - When serializing, all strings are handled equally. When deserializing,
277
///      there are three flavors of strings: transient, owned, and borrowed.
278
///  - **byte array** - \[u8\]
279
///    - Similar to strings, during deserialization byte arrays can be
280
///      transient, owned, or borrowed.
281
///  - **option**
282
///    - Either none or some value.
283
///  - **unit**
284
///    - The type of `()` in Rust. It represents an anonymous value containing
285
///      no data.
286
///  - **unit_struct**
287
///    - For example `struct Unit` or `PhantomData<T>`. It represents a named
288
///      value containing no data.
289
///  - **unit_variant**
290
///    - For example the `E::A` and `E::B` in `enum E { A, B }`.
291
///  - **newtype_struct**
292
///    - For example `struct Millimeters(u8)`.
293
///  - **newtype_variant**
294
///    - For example the `E::N` in `enum E { N(u8) }`.
295
///  - **seq**
296
///    - A variably sized heterogeneous sequence of values, for example
297
///      `Vec<T>` or `HashSet<T>`. When serializing, the length may or may not
298
///      be known before iterating through all the data. When deserializing,
299
///      the length is determined by looking at the serialized data.
300
///  - **tuple**
301
///    - A statically sized heterogeneous sequence of values for which the
302
///      length will be known at deserialization time without looking at the
303
///      serialized data, for example `(u8,)` or `(String, u64, Vec<T>)` or
304
///      `[u64; 10]`.
305
///  - **tuple_struct**
306
///    - A named tuple, for example `struct Rgb(u8, u8, u8)`.
307
///  - **tuple_variant**
308
///    - For example the `E::T` in `enum E { T(u8, u8) }`.
309
///  - **map**
310
///    - A heterogeneous key-value pairing, for example `BTreeMap<K, V>`.
311
///  - **struct**
312
///    - A heterogeneous key-value pairing in which the keys are strings and
313
///      will be known at deserialization time without looking at the
314
///      serialized data, for example `struct S { r: u8, g: u8, b: u8 }`.
315
///  - **struct_variant**
316
///    - For example the `E::S` in `enum E { S { r: u8, g: u8, b: u8 } }`.
317
///
318
/// Many Serde serializers produce text or binary data as output, for example
319
/// JSON or Postcard. This is not a requirement of the `Serializer` trait, and
320
/// there are serializers that do not produce text or binary output. One example
321
/// is the `serde_json::value::Serializer` (distinct from the main `serde_json`
322
/// serializer) that produces a `serde_json::Value` data structure in memory as
323
/// output.
324
///
325
/// [Serde data model]: https://serde.rs/data-model.html
326
///
327
/// # Example implementation
328
///
329
/// The [example data format] presented on the website contains example code for
330
/// a basic JSON `Serializer`.
331
///
332
/// [example data format]: https://serde.rs/data-format.html
333
pub trait Serializer: Sized {
334
    /// The output type produced by this `Serializer` during successful
335
    /// serialization. Most serializers that produce text or binary output
336
    /// should set `Ok = ()` and serialize into an [`io::Write`] or buffer
337
    /// contained within the `Serializer` instance. Serializers that build
338
    /// in-memory data structures may be simplified by using `Ok` to propagate
339
    /// the data structure around.
340
    ///
341
    /// [`io::Write`]: https://doc.rust-lang.org/std/io/trait.Write.html
342
    type Ok;
343
344
    /// The error type when some error occurs during serialization.
345
    type Error: Error;
346
347
    /// Type returned from [`serialize_seq`] for serializing the content of the
348
    /// sequence.
349
    ///
350
    /// [`serialize_seq`]: #tymethod.serialize_seq
351
    type SerializeSeq: SerializeSeq<Ok = Self::Ok, Error = Self::Error>;
352
353
    /// Type returned from [`serialize_tuple`] for serializing the content of
354
    /// the tuple.
355
    ///
356
    /// [`serialize_tuple`]: #tymethod.serialize_tuple
357
    type SerializeTuple: SerializeTuple<Ok = Self::Ok, Error = Self::Error>;
358
359
    /// Type returned from [`serialize_tuple_struct`] for serializing the
360
    /// content of the tuple struct.
361
    ///
362
    /// [`serialize_tuple_struct`]: #tymethod.serialize_tuple_struct
363
    type SerializeTupleStruct: SerializeTupleStruct<Ok = Self::Ok, Error = Self::Error>;
364
365
    /// Type returned from [`serialize_tuple_variant`] for serializing the
366
    /// content of the tuple variant.
367
    ///
368
    /// [`serialize_tuple_variant`]: #tymethod.serialize_tuple_variant
369
    type SerializeTupleVariant: SerializeTupleVariant<Ok = Self::Ok, Error = Self::Error>;
370
371
    /// Type returned from [`serialize_map`] for serializing the content of the
372
    /// map.
373
    ///
374
    /// [`serialize_map`]: #tymethod.serialize_map
375
    type SerializeMap: SerializeMap<Ok = Self::Ok, Error = Self::Error>;
376
377
    /// Type returned from [`serialize_struct`] for serializing the content of
378
    /// the struct.
379
    ///
380
    /// [`serialize_struct`]: #tymethod.serialize_struct
381
    type SerializeStruct: SerializeStruct<Ok = Self::Ok, Error = Self::Error>;
382
383
    /// Type returned from [`serialize_struct_variant`] for serializing the
384
    /// content of the struct variant.
385
    ///
386
    /// [`serialize_struct_variant`]: #tymethod.serialize_struct_variant
387
    type SerializeStructVariant: SerializeStructVariant<Ok = Self::Ok, Error = Self::Error>;
388
389
    /// Serialize a `bool` value.
390
    ///
391
    /// ```edition2018
392
    /// # use serde::Serializer;
393
    /// #
394
    /// # serde::__private_serialize!();
395
    /// #
396
    /// impl Serialize for bool {
397
    ///     fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
398
    ///     where
399
    ///         S: Serializer,
400
    ///     {
401
    ///         serializer.serialize_bool(*self)
402
    ///     }
403
    /// }
404
    /// ```
405
    fn serialize_bool(self, v: bool) -> Result<Self::Ok, Self::Error>;
406
407
    /// Serialize an `i8` value.
408
    ///
409
    /// If the format does not differentiate between `i8` and `i64`, a
410
    /// reasonable implementation would be to cast the value to `i64` and
411
    /// forward to `serialize_i64`.
412
    ///
413
    /// ```edition2018
414
    /// # use serde::Serializer;
415
    /// #
416
    /// # serde::__private_serialize!();
417
    /// #
418
    /// impl Serialize for i8 {
419
    ///     fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
420
    ///     where
421
    ///         S: Serializer,
422
    ///     {
423
    ///         serializer.serialize_i8(*self)
424
    ///     }
425
    /// }
426
    /// ```
427
    fn serialize_i8(self, v: i8) -> Result<Self::Ok, Self::Error>;
428
429
    /// Serialize an `i16` value.
430
    ///
431
    /// If the format does not differentiate between `i16` and `i64`, a
432
    /// reasonable implementation would be to cast the value to `i64` and
433
    /// forward to `serialize_i64`.
434
    ///
435
    /// ```edition2018
436
    /// # use serde::Serializer;
437
    /// #
438
    /// # serde::__private_serialize!();
439
    /// #
440
    /// impl Serialize for i16 {
441
    ///     fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
442
    ///     where
443
    ///         S: Serializer,
444
    ///     {
445
    ///         serializer.serialize_i16(*self)
446
    ///     }
447
    /// }
448
    /// ```
449
    fn serialize_i16(self, v: i16) -> Result<Self::Ok, Self::Error>;
450
451
    /// Serialize an `i32` value.
452
    ///
453
    /// If the format does not differentiate between `i32` and `i64`, a
454
    /// reasonable implementation would be to cast the value to `i64` and
455
    /// forward to `serialize_i64`.
456
    ///
457
    /// ```edition2018
458
    /// # use serde::Serializer;
459
    /// #
460
    /// # serde::__private_serialize!();
461
    /// #
462
    /// impl Serialize for i32 {
463
    ///     fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
464
    ///     where
465
    ///         S: Serializer,
466
    ///     {
467
    ///         serializer.serialize_i32(*self)
468
    ///     }
469
    /// }
470
    /// ```
471
    fn serialize_i32(self, v: i32) -> Result<Self::Ok, Self::Error>;
472
473
    /// Serialize an `i64` value.
474
    ///
475
    /// ```edition2018
476
    /// # use serde::Serializer;
477
    /// #
478
    /// # serde::__private_serialize!();
479
    /// #
480
    /// impl Serialize for i64 {
481
    ///     fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
482
    ///     where
483
    ///         S: Serializer,
484
    ///     {
485
    ///         serializer.serialize_i64(*self)
486
    ///     }
487
    /// }
488
    /// ```
489
    fn serialize_i64(self, v: i64) -> Result<Self::Ok, Self::Error>;
490
491
    serde_if_integer128! {
492
        /// Serialize an `i128` value.
493
        ///
494
        /// ```edition2018
495
        /// # use serde::Serializer;
496
        /// #
497
        /// # serde::__private_serialize!();
498
        /// #
499
        /// impl Serialize for i128 {
500
        ///     fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
501
        ///     where
502
        ///         S: Serializer,
503
        ///     {
504
        ///         serializer.serialize_i128(*self)
505
        ///     }
506
        /// }
507
        /// ```
508
        ///
509
        /// This method is available only on Rust compiler versions >=1.26. The
510
        /// default behavior unconditionally returns an error.
511
0
        fn serialize_i128(self, v: i128) -> Result<Self::Ok, Self::Error> {
512
0
            let _ = v;
513
0
            Err(Error::custom("i128 is not supported"))
514
0
        }
515
    }
516
517
    /// Serialize a `u8` value.
518
    ///
519
    /// If the format does not differentiate between `u8` and `u64`, a
520
    /// reasonable implementation would be to cast the value to `u64` and
521
    /// forward to `serialize_u64`.
522
    ///
523
    /// ```edition2018
524
    /// # use serde::Serializer;
525
    /// #
526
    /// # serde::__private_serialize!();
527
    /// #
528
    /// impl Serialize for u8 {
529
    ///     fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
530
    ///     where
531
    ///         S: Serializer,
532
    ///     {
533
    ///         serializer.serialize_u8(*self)
534
    ///     }
535
    /// }
536
    /// ```
537
    fn serialize_u8(self, v: u8) -> Result<Self::Ok, Self::Error>;
538
539
    /// Serialize a `u16` value.
540
    ///
541
    /// If the format does not differentiate between `u16` and `u64`, a
542
    /// reasonable implementation would be to cast the value to `u64` and
543
    /// forward to `serialize_u64`.
544
    ///
545
    /// ```edition2018
546
    /// # use serde::Serializer;
547
    /// #
548
    /// # serde::__private_serialize!();
549
    /// #
550
    /// impl Serialize for u16 {
551
    ///     fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
552
    ///     where
553
    ///         S: Serializer,
554
    ///     {
555
    ///         serializer.serialize_u16(*self)
556
    ///     }
557
    /// }
558
    /// ```
559
    fn serialize_u16(self, v: u16) -> Result<Self::Ok, Self::Error>;
560
561
    /// Serialize a `u32` value.
562
    ///
563
    /// If the format does not differentiate between `u32` and `u64`, a
564
    /// reasonable implementation would be to cast the value to `u64` and
565
    /// forward to `serialize_u64`.
566
    ///
567
    /// ```edition2018
568
    /// # use serde::Serializer;
569
    /// #
570
    /// # serde::__private_serialize!();
571
    /// #
572
    /// impl Serialize for u32 {
573
    ///     fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
574
    ///     where
575
    ///         S: Serializer,
576
    ///     {
577
    ///         serializer.serialize_u32(*self)
578
    ///     }
579
    /// }
580
    /// ```
581
    fn serialize_u32(self, v: u32) -> Result<Self::Ok, Self::Error>;
582
583
    /// Serialize a `u64` value.
584
    ///
585
    /// ```edition2018
586
    /// # use serde::Serializer;
587
    /// #
588
    /// # serde::__private_serialize!();
589
    /// #
590
    /// impl Serialize for u64 {
591
    ///     fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
592
    ///     where
593
    ///         S: Serializer,
594
    ///     {
595
    ///         serializer.serialize_u64(*self)
596
    ///     }
597
    /// }
598
    /// ```
599
    fn serialize_u64(self, v: u64) -> Result<Self::Ok, Self::Error>;
600
601
    serde_if_integer128! {
602
        /// Serialize a `u128` value.
603
        ///
604
        /// ```edition2018
605
        /// # use serde::Serializer;
606
        /// #
607
        /// # serde::__private_serialize!();
608
        /// #
609
        /// impl Serialize for u128 {
610
        ///     fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
611
        ///     where
612
        ///         S: Serializer,
613
        ///     {
614
        ///         serializer.serialize_u128(*self)
615
        ///     }
616
        /// }
617
        /// ```
618
        ///
619
        /// This method is available only on Rust compiler versions >=1.26. The
620
        /// default behavior unconditionally returns an error.
621
0
        fn serialize_u128(self, v: u128) -> Result<Self::Ok, Self::Error> {
622
0
            let _ = v;
623
0
            Err(Error::custom("u128 is not supported"))
624
0
        }
625
    }
626
627
    /// Serialize an `f32` value.
628
    ///
629
    /// If the format does not differentiate between `f32` and `f64`, a
630
    /// reasonable implementation would be to cast the value to `f64` and
631
    /// forward to `serialize_f64`.
632
    ///
633
    /// ```edition2018
634
    /// # use serde::Serializer;
635
    /// #
636
    /// # serde::__private_serialize!();
637
    /// #
638
    /// impl Serialize for f32 {
639
    ///     fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
640
    ///     where
641
    ///         S: Serializer,
642
    ///     {
643
    ///         serializer.serialize_f32(*self)
644
    ///     }
645
    /// }
646
    /// ```
647
    fn serialize_f32(self, v: f32) -> Result<Self::Ok, Self::Error>;
648
649
    /// Serialize an `f64` value.
650
    ///
651
    /// ```edition2018
652
    /// # use serde::Serializer;
653
    /// #
654
    /// # serde::__private_serialize!();
655
    /// #
656
    /// impl Serialize for f64 {
657
    ///     fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
658
    ///     where
659
    ///         S: Serializer,
660
    ///     {
661
    ///         serializer.serialize_f64(*self)
662
    ///     }
663
    /// }
664
    /// ```
665
    fn serialize_f64(self, v: f64) -> Result<Self::Ok, Self::Error>;
666
667
    /// Serialize a character.
668
    ///
669
    /// If the format does not support characters, it is reasonable to serialize
670
    /// it as a single element `str` or a `u32`.
671
    ///
672
    /// ```edition2018
673
    /// # use serde::Serializer;
674
    /// #
675
    /// # serde::__private_serialize!();
676
    /// #
677
    /// impl Serialize for char {
678
    ///     fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
679
    ///     where
680
    ///         S: Serializer,
681
    ///     {
682
    ///         serializer.serialize_char(*self)
683
    ///     }
684
    /// }
685
    /// ```
686
    fn serialize_char(self, v: char) -> Result<Self::Ok, Self::Error>;
687
688
    /// Serialize a `&str`.
689
    ///
690
    /// ```edition2018
691
    /// # use serde::Serializer;
692
    /// #
693
    /// # serde::__private_serialize!();
694
    /// #
695
    /// impl Serialize for str {
696
    ///     fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
697
    ///     where
698
    ///         S: Serializer,
699
    ///     {
700
    ///         serializer.serialize_str(self)
701
    ///     }
702
    /// }
703
    /// ```
704
    fn serialize_str(self, v: &str) -> Result<Self::Ok, Self::Error>;
705
706
    /// Serialize a chunk of raw byte data.
707
    ///
708
    /// Enables serializers to serialize byte slices more compactly or more
709
    /// efficiently than other types of slices. If no efficient implementation
710
    /// is available, a reasonable implementation would be to forward to
711
    /// `serialize_seq`. If forwarded, the implementation looks usually just
712
    /// like this:
713
    ///
714
    /// ```edition2018
715
    /// # use serde::ser::{Serializer, SerializeSeq};
716
    /// # use serde::__private::doc::Error;
717
    /// #
718
    /// # struct MySerializer;
719
    /// #
720
    /// # impl Serializer for MySerializer {
721
    /// #     type Ok = ();
722
    /// #     type Error = Error;
723
    /// #
724
    /// fn serialize_bytes(self, v: &[u8]) -> Result<Self::Ok, Self::Error> {
725
    ///     let mut seq = self.serialize_seq(Some(v.len()))?;
726
    ///     for b in v {
727
    ///         seq.serialize_element(b)?;
728
    ///     }
729
    ///     seq.end()
730
    /// }
731
    /// #
732
    /// #     serde::__serialize_unimplemented! {
733
    /// #         bool i8 i16 i32 i64 u8 u16 u32 u64 f32 f64 char str none some
734
    /// #         unit unit_struct unit_variant newtype_struct newtype_variant
735
    /// #         seq tuple tuple_struct tuple_variant map struct struct_variant
736
    /// #     }
737
    /// # }
738
    /// ```
739
    fn serialize_bytes(self, v: &[u8]) -> Result<Self::Ok, Self::Error>;
740
741
    /// Serialize a [`None`] value.
742
    ///
743
    /// ```edition2018
744
    /// # use serde::{Serialize, Serializer};
745
    /// #
746
    /// # enum Option<T> {
747
    /// #     Some(T),
748
    /// #     None,
749
    /// # }
750
    /// #
751
    /// # use self::Option::{Some, None};
752
    /// #
753
    /// impl<T> Serialize for Option<T>
754
    /// where
755
    ///     T: Serialize,
756
    /// {
757
    ///     fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
758
    ///     where
759
    ///         S: Serializer,
760
    ///     {
761
    ///         match *self {
762
    ///             Some(ref value) => serializer.serialize_some(value),
763
    ///             None => serializer.serialize_none(),
764
    ///         }
765
    ///     }
766
    /// }
767
    /// #
768
    /// # fn main() {}
769
    /// ```
770
    ///
771
    /// [`None`]: https://doc.rust-lang.org/std/option/enum.Option.html#variant.None
772
    fn serialize_none(self) -> Result<Self::Ok, Self::Error>;
773
774
    /// Serialize a [`Some(T)`] value.
775
    ///
776
    /// ```edition2018
777
    /// # use serde::{Serialize, Serializer};
778
    /// #
779
    /// # enum Option<T> {
780
    /// #     Some(T),
781
    /// #     None,
782
    /// # }
783
    /// #
784
    /// # use self::Option::{Some, None};
785
    /// #
786
    /// impl<T> Serialize for Option<T>
787
    /// where
788
    ///     T: Serialize,
789
    /// {
790
    ///     fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
791
    ///     where
792
    ///         S: Serializer,
793
    ///     {
794
    ///         match *self {
795
    ///             Some(ref value) => serializer.serialize_some(value),
796
    ///             None => serializer.serialize_none(),
797
    ///         }
798
    ///     }
799
    /// }
800
    /// #
801
    /// # fn main() {}
802
    /// ```
803
    ///
804
    /// [`Some(T)`]: https://doc.rust-lang.org/std/option/enum.Option.html#variant.Some
805
    fn serialize_some<T: ?Sized>(self, value: &T) -> Result<Self::Ok, Self::Error>
806
    where
807
        T: Serialize;
808
809
    /// Serialize a `()` value.
810
    ///
811
    /// ```edition2018
812
    /// # use serde::Serializer;
813
    /// #
814
    /// # serde::__private_serialize!();
815
    /// #
816
    /// impl Serialize for () {
817
    ///     fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
818
    ///     where
819
    ///         S: Serializer,
820
    ///     {
821
    ///         serializer.serialize_unit()
822
    ///     }
823
    /// }
824
    /// ```
825
    fn serialize_unit(self) -> Result<Self::Ok, Self::Error>;
826
827
    /// Serialize a unit struct like `struct Unit` or `PhantomData<T>`.
828
    ///
829
    /// A reasonable implementation would be to forward to `serialize_unit`.
830
    ///
831
    /// ```edition2018
832
    /// use serde::{Serialize, Serializer};
833
    ///
834
    /// struct Nothing;
835
    ///
836
    /// impl Serialize for Nothing {
837
    ///     fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
838
    ///     where
839
    ///         S: Serializer,
840
    ///     {
841
    ///         serializer.serialize_unit_struct("Nothing")
842
    ///     }
843
    /// }
844
    /// ```
845
    fn serialize_unit_struct(self, name: &'static str) -> Result<Self::Ok, Self::Error>;
846
847
    /// Serialize a unit variant like `E::A` in `enum E { A, B }`.
848
    ///
849
    /// The `name` is the name of the enum, the `variant_index` is the index of
850
    /// this variant within the enum, and the `variant` is the name of the
851
    /// variant.
852
    ///
853
    /// ```edition2018
854
    /// use serde::{Serialize, Serializer};
855
    ///
856
    /// enum E {
857
    ///     A,
858
    ///     B,
859
    /// }
860
    ///
861
    /// impl Serialize for E {
862
    ///     fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
863
    ///     where
864
    ///         S: Serializer,
865
    ///     {
866
    ///         match *self {
867
    ///             E::A => serializer.serialize_unit_variant("E", 0, "A"),
868
    ///             E::B => serializer.serialize_unit_variant("E", 1, "B"),
869
    ///         }
870
    ///     }
871
    /// }
872
    /// ```
873
    fn serialize_unit_variant(
874
        self,
875
        name: &'static str,
876
        variant_index: u32,
877
        variant: &'static str,
878
    ) -> Result<Self::Ok, Self::Error>;
879
880
    /// Serialize a newtype struct like `struct Millimeters(u8)`.
881
    ///
882
    /// Serializers are encouraged to treat newtype structs as insignificant
883
    /// wrappers around the data they contain. A reasonable implementation would
884
    /// be to forward to `value.serialize(self)`.
885
    ///
886
    /// ```edition2018
887
    /// use serde::{Serialize, Serializer};
888
    ///
889
    /// struct Millimeters(u8);
890
    ///
891
    /// impl Serialize for Millimeters {
892
    ///     fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
893
    ///     where
894
    ///         S: Serializer,
895
    ///     {
896
    ///         serializer.serialize_newtype_struct("Millimeters", &self.0)
897
    ///     }
898
    /// }
899
    /// ```
900
    fn serialize_newtype_struct<T: ?Sized>(
901
        self,
902
        name: &'static str,
903
        value: &T,
904
    ) -> Result<Self::Ok, Self::Error>
905
    where
906
        T: Serialize;
907
908
    /// Serialize a newtype variant like `E::N` in `enum E { N(u8) }`.
909
    ///
910
    /// The `name` is the name of the enum, the `variant_index` is the index of
911
    /// this variant within the enum, and the `variant` is the name of the
912
    /// variant. The `value` is the data contained within this newtype variant.
913
    ///
914
    /// ```edition2018
915
    /// use serde::{Serialize, Serializer};
916
    ///
917
    /// enum E {
918
    ///     M(String),
919
    ///     N(u8),
920
    /// }
921
    ///
922
    /// impl Serialize for E {
923
    ///     fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
924
    ///     where
925
    ///         S: Serializer,
926
    ///     {
927
    ///         match *self {
928
    ///             E::M(ref s) => serializer.serialize_newtype_variant("E", 0, "M", s),
929
    ///             E::N(n) => serializer.serialize_newtype_variant("E", 1, "N", &n),
930
    ///         }
931
    ///     }
932
    /// }
933
    /// ```
934
    fn serialize_newtype_variant<T: ?Sized>(
935
        self,
936
        name: &'static str,
937
        variant_index: u32,
938
        variant: &'static str,
939
        value: &T,
940
    ) -> Result<Self::Ok, Self::Error>
941
    where
942
        T: Serialize;
943
944
    /// Begin to serialize a variably sized sequence. This call must be
945
    /// followed by zero or more calls to `serialize_element`, then a call to
946
    /// `end`.
947
    ///
948
    /// The argument is the number of elements in the sequence, which may or may
949
    /// not be computable before the sequence is iterated. Some serializers only
950
    /// support sequences whose length is known up front.
951
    ///
952
    /// ```edition2018
953
    /// # use std::marker::PhantomData;
954
    /// #
955
    /// # struct Vec<T>(PhantomData<T>);
956
    /// #
957
    /// # impl<T> Vec<T> {
958
    /// #     fn len(&self) -> usize {
959
    /// #         unimplemented!()
960
    /// #     }
961
    /// # }
962
    /// #
963
    /// # impl<'a, T> IntoIterator for &'a Vec<T> {
964
    /// #     type Item = &'a T;
965
    /// #     type IntoIter = Box<Iterator<Item = &'a T>>;
966
    /// #
967
    /// #     fn into_iter(self) -> Self::IntoIter {
968
    /// #         unimplemented!()
969
    /// #     }
970
    /// # }
971
    /// #
972
    /// use serde::ser::{Serialize, Serializer, SerializeSeq};
973
    ///
974
    /// impl<T> Serialize for Vec<T>
975
    /// where
976
    ///     T: Serialize,
977
    /// {
978
    ///     fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
979
    ///     where
980
    ///         S: Serializer,
981
    ///     {
982
    ///         let mut seq = serializer.serialize_seq(Some(self.len()))?;
983
    ///         for element in self {
984
    ///             seq.serialize_element(element)?;
985
    ///         }
986
    ///         seq.end()
987
    ///     }
988
    /// }
989
    /// ```
990
    fn serialize_seq(self, len: Option<usize>) -> Result<Self::SerializeSeq, Self::Error>;
991
992
    /// Begin to serialize a statically sized sequence whose length will be
993
    /// known at deserialization time without looking at the serialized data.
994
    /// This call must be followed by zero or more calls to `serialize_element`,
995
    /// then a call to `end`.
996
    ///
997
    /// ```edition2018
998
    /// use serde::ser::{Serialize, Serializer, SerializeTuple};
999
    ///
1000
    /// # mod fool {
1001
    /// #     trait Serialize {}
1002
    /// impl<A, B, C> Serialize for (A, B, C)
1003
    /// #     {}
1004
    /// # }
1005
    /// #
1006
    /// # struct Tuple3<A, B, C>(A, B, C);
1007
    /// #
1008
    /// # impl<A, B, C> Serialize for Tuple3<A, B, C>
1009
    /// where
1010
    ///     A: Serialize,
1011
    ///     B: Serialize,
1012
    ///     C: Serialize,
1013
    /// {
1014
    ///     fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
1015
    ///     where
1016
    ///         S: Serializer,
1017
    ///     {
1018
    ///         let mut tup = serializer.serialize_tuple(3)?;
1019
    ///         tup.serialize_element(&self.0)?;
1020
    ///         tup.serialize_element(&self.1)?;
1021
    ///         tup.serialize_element(&self.2)?;
1022
    ///         tup.end()
1023
    ///     }
1024
    /// }
1025
    /// ```
1026
    ///
1027
    /// ```edition2018
1028
    /// use serde::ser::{Serialize, SerializeTuple, Serializer};
1029
    ///
1030
    /// const VRAM_SIZE: usize = 386;
1031
    /// struct Vram([u16; VRAM_SIZE]);
1032
    ///
1033
    /// impl Serialize for Vram {
1034
    ///     fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
1035
    ///     where
1036
    ///         S: Serializer,
1037
    ///     {
1038
    ///         let mut seq = serializer.serialize_tuple(VRAM_SIZE)?;
1039
    ///         for element in &self.0[..] {
1040
    ///             seq.serialize_element(element)?;
1041
    ///         }
1042
    ///         seq.end()
1043
    ///     }
1044
    /// }
1045
    /// ```
1046
    fn serialize_tuple(self, len: usize) -> Result<Self::SerializeTuple, Self::Error>;
1047
1048
    /// Begin to serialize a tuple struct like `struct Rgb(u8, u8, u8)`. This
1049
    /// call must be followed by zero or more calls to `serialize_field`, then a
1050
    /// call to `end`.
1051
    ///
1052
    /// The `name` is the name of the tuple struct and the `len` is the number
1053
    /// of data fields that will be serialized.
1054
    ///
1055
    /// ```edition2018
1056
    /// use serde::ser::{Serialize, SerializeTupleStruct, Serializer};
1057
    ///
1058
    /// struct Rgb(u8, u8, u8);
1059
    ///
1060
    /// impl Serialize for Rgb {
1061
    ///     fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
1062
    ///     where
1063
    ///         S: Serializer,
1064
    ///     {
1065
    ///         let mut ts = serializer.serialize_tuple_struct("Rgb", 3)?;
1066
    ///         ts.serialize_field(&self.0)?;
1067
    ///         ts.serialize_field(&self.1)?;
1068
    ///         ts.serialize_field(&self.2)?;
1069
    ///         ts.end()
1070
    ///     }
1071
    /// }
1072
    /// ```
1073
    fn serialize_tuple_struct(
1074
        self,
1075
        name: &'static str,
1076
        len: usize,
1077
    ) -> Result<Self::SerializeTupleStruct, Self::Error>;
1078
1079
    /// Begin to serialize a tuple variant like `E::T` in `enum E { T(u8, u8)
1080
    /// }`. This call must be followed by zero or more calls to
1081
    /// `serialize_field`, then a call to `end`.
1082
    ///
1083
    /// The `name` is the name of the enum, the `variant_index` is the index of
1084
    /// this variant within the enum, the `variant` is the name of the variant,
1085
    /// and the `len` is the number of data fields that will be serialized.
1086
    ///
1087
    /// ```edition2018
1088
    /// use serde::ser::{Serialize, SerializeTupleVariant, Serializer};
1089
    ///
1090
    /// enum E {
1091
    ///     T(u8, u8),
1092
    ///     U(String, u32, u32),
1093
    /// }
1094
    ///
1095
    /// impl Serialize for E {
1096
    ///     fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
1097
    ///     where
1098
    ///         S: Serializer,
1099
    ///     {
1100
    ///         match *self {
1101
    ///             E::T(ref a, ref b) => {
1102
    ///                 let mut tv = serializer.serialize_tuple_variant("E", 0, "T", 2)?;
1103
    ///                 tv.serialize_field(a)?;
1104
    ///                 tv.serialize_field(b)?;
1105
    ///                 tv.end()
1106
    ///             }
1107
    ///             E::U(ref a, ref b, ref c) => {
1108
    ///                 let mut tv = serializer.serialize_tuple_variant("E", 1, "U", 3)?;
1109
    ///                 tv.serialize_field(a)?;
1110
    ///                 tv.serialize_field(b)?;
1111
    ///                 tv.serialize_field(c)?;
1112
    ///                 tv.end()
1113
    ///             }
1114
    ///         }
1115
    ///     }
1116
    /// }
1117
    /// ```
1118
    fn serialize_tuple_variant(
1119
        self,
1120
        name: &'static str,
1121
        variant_index: u32,
1122
        variant: &'static str,
1123
        len: usize,
1124
    ) -> Result<Self::SerializeTupleVariant, Self::Error>;
1125
1126
    /// Begin to serialize a map. This call must be followed by zero or more
1127
    /// calls to `serialize_key` and `serialize_value`, then a call to `end`.
1128
    ///
1129
    /// The argument is the number of elements in the map, which may or may not
1130
    /// be computable before the map is iterated. Some serializers only support
1131
    /// maps whose length is known up front.
1132
    ///
1133
    /// ```edition2018
1134
    /// # use std::marker::PhantomData;
1135
    /// #
1136
    /// # struct HashMap<K, V>(PhantomData<K>, PhantomData<V>);
1137
    /// #
1138
    /// # impl<K, V> HashMap<K, V> {
1139
    /// #     fn len(&self) -> usize {
1140
    /// #         unimplemented!()
1141
    /// #     }
1142
    /// # }
1143
    /// #
1144
    /// # impl<'a, K, V> IntoIterator for &'a HashMap<K, V> {
1145
    /// #     type Item = (&'a K, &'a V);
1146
    /// #     type IntoIter = Box<Iterator<Item = (&'a K, &'a V)>>;
1147
    /// #
1148
    /// #     fn into_iter(self) -> Self::IntoIter {
1149
    /// #         unimplemented!()
1150
    /// #     }
1151
    /// # }
1152
    /// #
1153
    /// use serde::ser::{Serialize, Serializer, SerializeMap};
1154
    ///
1155
    /// impl<K, V> Serialize for HashMap<K, V>
1156
    /// where
1157
    ///     K: Serialize,
1158
    ///     V: Serialize,
1159
    /// {
1160
    ///     fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
1161
    ///     where
1162
    ///         S: Serializer,
1163
    ///     {
1164
    ///         let mut map = serializer.serialize_map(Some(self.len()))?;
1165
    ///         for (k, v) in self {
1166
    ///             map.serialize_entry(k, v)?;
1167
    ///         }
1168
    ///         map.end()
1169
    ///     }
1170
    /// }
1171
    /// ```
1172
    fn serialize_map(self, len: Option<usize>) -> Result<Self::SerializeMap, Self::Error>;
1173
1174
    /// Begin to serialize a struct like `struct Rgb { r: u8, g: u8, b: u8 }`.
1175
    /// This call must be followed by zero or more calls to `serialize_field`,
1176
    /// then a call to `end`.
1177
    ///
1178
    /// The `name` is the name of the struct and the `len` is the number of
1179
    /// data fields that will be serialized.
1180
    ///
1181
    /// ```edition2018
1182
    /// use serde::ser::{Serialize, SerializeStruct, Serializer};
1183
    ///
1184
    /// struct Rgb {
1185
    ///     r: u8,
1186
    ///     g: u8,
1187
    ///     b: u8,
1188
    /// }
1189
    ///
1190
    /// impl Serialize for Rgb {
1191
    ///     fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
1192
    ///     where
1193
    ///         S: Serializer,
1194
    ///     {
1195
    ///         let mut rgb = serializer.serialize_struct("Rgb", 3)?;
1196
    ///         rgb.serialize_field("r", &self.r)?;
1197
    ///         rgb.serialize_field("g", &self.g)?;
1198
    ///         rgb.serialize_field("b", &self.b)?;
1199
    ///         rgb.end()
1200
    ///     }
1201
    /// }
1202
    /// ```
1203
    fn serialize_struct(
1204
        self,
1205
        name: &'static str,
1206
        len: usize,
1207
    ) -> Result<Self::SerializeStruct, Self::Error>;
1208
1209
    /// Begin to serialize a struct variant like `E::S` in `enum E { S { r: u8,
1210
    /// g: u8, b: u8 } }`. This call must be followed by zero or more calls to
1211
    /// `serialize_field`, then a call to `end`.
1212
    ///
1213
    /// The `name` is the name of the enum, the `variant_index` is the index of
1214
    /// this variant within the enum, the `variant` is the name of the variant,
1215
    /// and the `len` is the number of data fields that will be serialized.
1216
    ///
1217
    /// ```edition2018
1218
    /// use serde::ser::{Serialize, SerializeStructVariant, Serializer};
1219
    ///
1220
    /// enum E {
1221
    ///     S { r: u8, g: u8, b: u8 },
1222
    /// }
1223
    ///
1224
    /// impl Serialize for E {
1225
    ///     fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
1226
    ///     where
1227
    ///         S: Serializer,
1228
    ///     {
1229
    ///         match *self {
1230
    ///             E::S {
1231
    ///                 ref r,
1232
    ///                 ref g,
1233
    ///                 ref b,
1234
    ///             } => {
1235
    ///                 let mut sv = serializer.serialize_struct_variant("E", 0, "S", 3)?;
1236
    ///                 sv.serialize_field("r", r)?;
1237
    ///                 sv.serialize_field("g", g)?;
1238
    ///                 sv.serialize_field("b", b)?;
1239
    ///                 sv.end()
1240
    ///             }
1241
    ///         }
1242
    ///     }
1243
    /// }
1244
    /// ```
1245
    fn serialize_struct_variant(
1246
        self,
1247
        name: &'static str,
1248
        variant_index: u32,
1249
        variant: &'static str,
1250
        len: usize,
1251
    ) -> Result<Self::SerializeStructVariant, Self::Error>;
1252
1253
    /// Collect an iterator as a sequence.
1254
    ///
1255
    /// The default implementation serializes each item yielded by the iterator
1256
    /// using [`serialize_seq`]. Implementors should not need to override this
1257
    /// method.
1258
    ///
1259
    /// ```edition2018
1260
    /// use serde::{Serialize, Serializer};
1261
    ///
1262
    /// struct SecretlyOneHigher {
1263
    ///     data: Vec<i32>,
1264
    /// }
1265
    ///
1266
    /// impl Serialize for SecretlyOneHigher {
1267
    ///     fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
1268
    ///     where
1269
    ///         S: Serializer,
1270
    ///     {
1271
    ///         serializer.collect_seq(self.data.iter().map(|x| x + 1))
1272
    ///     }
1273
    /// }
1274
    /// ```
1275
    ///
1276
    /// [`serialize_seq`]: #tymethod.serialize_seq
1277
0
    fn collect_seq<I>(self, iter: I) -> Result<Self::Ok, Self::Error>
1278
0
    where
1279
0
        I: IntoIterator,
1280
0
        <I as IntoIterator>::Item: Serialize,
1281
    {
1282
0
        let iter = iter.into_iter();
1283
0
        let mut serializer = try!(self.serialize_seq(iterator_len_hint(&iter)));
1284
1285
        #[cfg(not(no_iterator_try_fold))]
1286
        {
1287
0
            let mut iter = iter;
1288
0
            try!(iter.try_for_each(|item| serializer.serialize_element(&item)));
Unexecuted instantiation: <&mut serde_json::ser::Serializer<&mut alloc::vec::Vec<u8>> as serde::ser::Serializer>::collect_seq::<&alloc::vec::Vec<audio_processor::config::Processor>>::{closure#0}
Unexecuted instantiation: <&mut serde_json::ser::Serializer<&mut alloc::vec::Vec<u8>> as serde::ser::Serializer>::collect_seq::<&alloc::vec::Vec<usize>>::{closure#0}
Unexecuted instantiation: <&mut serde_json::ser::Serializer<&mut alloc::vec::Vec<u8>, serde_json::ser::PrettyFormatter> as serde::ser::Serializer>::collect_seq::<&alloc::vec::Vec<alloc::string::String>>::{closure#0}
Unexecuted instantiation: <&mut serde_json::ser::Serializer<&mut alloc::vec::Vec<u8>, serde_json::ser::PrettyFormatter> as serde::ser::Serializer>::collect_seq::<&std::collections::hash::set::HashSet<alloc::string::String>>::{closure#0}
Unexecuted instantiation: <_ as serde::ser::Serializer>::collect_seq::<_>::{closure#0}
Unexecuted instantiation: <&mut serde_json::ser::Serializer<&mut <serde_json::value::Value as core::fmt::Display>::fmt::WriterFormatter> as serde::ser::Serializer>::collect_seq::<&alloc::vec::Vec<serde_json::value::Value>>::{closure#0}
Unexecuted instantiation: <&mut serde_json::ser::Serializer<&mut <serde_json::value::Value as core::fmt::Display>::fmt::WriterFormatter, serde_json::ser::PrettyFormatter> as serde::ser::Serializer>::collect_seq::<&alloc::vec::Vec<serde_json::value::Value>>::{closure#0}
1289
        }
1290
1291
        #[cfg(no_iterator_try_fold)]
1292
        {
1293
            for item in iter {
1294
                try!(serializer.serialize_element(&item));
1295
            }
1296
        }
1297
1298
0
        serializer.end()
1299
0
    }
Unexecuted instantiation: <&mut serde_json::ser::Serializer<&mut alloc::vec::Vec<u8>> as serde::ser::Serializer>::collect_seq::<&alloc::vec::Vec<audio_processor::config::Processor>>
Unexecuted instantiation: <&mut serde_json::ser::Serializer<&mut alloc::vec::Vec<u8>> as serde::ser::Serializer>::collect_seq::<&alloc::vec::Vec<usize>>
Unexecuted instantiation: <&mut serde_json::ser::Serializer<&mut alloc::vec::Vec<u8>, serde_json::ser::PrettyFormatter> as serde::ser::Serializer>::collect_seq::<&alloc::vec::Vec<alloc::string::String>>
Unexecuted instantiation: <&mut serde_json::ser::Serializer<&mut alloc::vec::Vec<u8>, serde_json::ser::PrettyFormatter> as serde::ser::Serializer>::collect_seq::<&std::collections::hash::set::HashSet<alloc::string::String>>
Unexecuted instantiation: <_ as serde::ser::Serializer>::collect_seq::<_>
Unexecuted instantiation: <&mut serde_json::ser::Serializer<&mut <serde_json::value::Value as core::fmt::Display>::fmt::WriterFormatter> as serde::ser::Serializer>::collect_seq::<&alloc::vec::Vec<serde_json::value::Value>>
Unexecuted instantiation: <&mut serde_json::ser::Serializer<&mut <serde_json::value::Value as core::fmt::Display>::fmt::WriterFormatter, serde_json::ser::PrettyFormatter> as serde::ser::Serializer>::collect_seq::<&alloc::vec::Vec<serde_json::value::Value>>
1300
1301
    /// Collect an iterator as a map.
1302
    ///
1303
    /// The default implementation serializes each pair yielded by the iterator
1304
    /// using [`serialize_map`]. Implementors should not need to override this
1305
    /// method.
1306
    ///
1307
    /// ```edition2018
1308
    /// use serde::{Serialize, Serializer};
1309
    /// use std::collections::BTreeSet;
1310
    ///
1311
    /// struct MapToUnit {
1312
    ///     keys: BTreeSet<i32>,
1313
    /// }
1314
    ///
1315
    /// // Serializes as a map in which the values are all unit.
1316
    /// impl Serialize for MapToUnit {
1317
    ///     fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
1318
    ///     where
1319
    ///         S: Serializer,
1320
    ///     {
1321
    ///         serializer.collect_map(self.keys.iter().map(|k| (k, ())))
1322
    ///     }
1323
    /// }
1324
    /// ```
1325
    ///
1326
    /// [`serialize_map`]: #tymethod.serialize_map
1327
0
    fn collect_map<K, V, I>(self, iter: I) -> Result<Self::Ok, Self::Error>
1328
0
    where
1329
0
        K: Serialize,
1330
0
        V: Serialize,
1331
0
        I: IntoIterator<Item = (K, V)>,
1332
    {
1333
0
        let iter = iter.into_iter();
1334
0
        let mut serializer = try!(self.serialize_map(iterator_len_hint(&iter)));
1335
1336
        #[cfg(not(no_iterator_try_fold))]
1337
        {
1338
0
            let mut iter = iter;
1339
0
            try!(iter.try_for_each(|(key, value)| serializer.serialize_entry(&key, &value)));
Unexecuted instantiation: <&mut serde_json::ser::Serializer<&mut alloc::vec::Vec<u8>> as serde::ser::Serializer>::collect_map::<&alloc::string::String, &alloc::string::String, &std::collections::hash::map::HashMap<alloc::string::String, alloc::string::String>>::{closure#0}
Unexecuted instantiation: <&mut serde_json::ser::Serializer<&mut alloc::vec::Vec<u8>, serde_json::ser::PrettyFormatter> as serde::ser::Serializer>::collect_map::<&alloc::string::String, &alloc::string::String, &std::collections::hash::map::HashMap<alloc::string::String, alloc::string::String>>::{closure#0}
Unexecuted instantiation: <&mut serde_json::ser::Serializer<&mut alloc::vec::Vec<u8>, serde_json::ser::PrettyFormatter> as serde::ser::Serializer>::collect_map::<&cras_common::types_internal::CRAS_NC_PROVIDER, &cras_s2::AudioEffectStatus, &std::collections::hash::map::HashMap<cras_common::types_internal::CRAS_NC_PROVIDER, cras_s2::AudioEffectStatus>>::{closure#0}
Unexecuted instantiation: <_ as serde::ser::Serializer>::collect_map::<_, _, _>::{closure#0}
1340
        }
1341
1342
        #[cfg(no_iterator_try_fold)]
1343
        {
1344
            for (key, value) in iter {
1345
                try!(serializer.serialize_entry(&key, &value));
1346
            }
1347
        }
1348
1349
0
        serializer.end()
1350
0
    }
Unexecuted instantiation: <&mut serde_json::ser::Serializer<&mut alloc::vec::Vec<u8>> as serde::ser::Serializer>::collect_map::<&alloc::string::String, &alloc::string::String, &std::collections::hash::map::HashMap<alloc::string::String, alloc::string::String>>
Unexecuted instantiation: <&mut serde_json::ser::Serializer<&mut alloc::vec::Vec<u8>, serde_json::ser::PrettyFormatter> as serde::ser::Serializer>::collect_map::<&alloc::string::String, &alloc::string::String, &std::collections::hash::map::HashMap<alloc::string::String, alloc::string::String>>
Unexecuted instantiation: <&mut serde_json::ser::Serializer<&mut alloc::vec::Vec<u8>, serde_json::ser::PrettyFormatter> as serde::ser::Serializer>::collect_map::<&cras_common::types_internal::CRAS_NC_PROVIDER, &cras_s2::AudioEffectStatus, &std::collections::hash::map::HashMap<cras_common::types_internal::CRAS_NC_PROVIDER, cras_s2::AudioEffectStatus>>
Unexecuted instantiation: <_ as serde::ser::Serializer>::collect_map::<_, _, _>
1351
1352
    /// Serialize a string produced by an implementation of `Display`.
1353
    ///
1354
    /// The default implementation builds a heap-allocated [`String`] and
1355
    /// delegates to [`serialize_str`]. Serializers are encouraged to provide a
1356
    /// more efficient implementation if possible.
1357
    ///
1358
    /// ```edition2018
1359
    /// # struct DateTime;
1360
    /// #
1361
    /// # impl DateTime {
1362
    /// #     fn naive_local(&self) -> () { () }
1363
    /// #     fn offset(&self) -> () { () }
1364
    /// # }
1365
    /// #
1366
    /// use serde::{Serialize, Serializer};
1367
    ///
1368
    /// impl Serialize for DateTime {
1369
    ///     fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
1370
    ///     where
1371
    ///         S: Serializer,
1372
    ///     {
1373
    ///         serializer.collect_str(&format_args!("{:?}{:?}",
1374
    ///                                              self.naive_local(),
1375
    ///                                              self.offset()))
1376
    ///     }
1377
    /// }
1378
    /// ```
1379
    ///
1380
    /// [`String`]: https://doc.rust-lang.org/std/string/struct.String.html
1381
    /// [`serialize_str`]: #tymethod.serialize_str
1382
    #[cfg(any(feature = "std", feature = "alloc"))]
1383
0
    fn collect_str<T: ?Sized>(self, value: &T) -> Result<Self::Ok, Self::Error>
1384
0
    where
1385
0
        T: Display,
1386
    {
1387
0
        self.serialize_str(&value.to_string())
1388
0
    }
1389
1390
    /// Serialize a string produced by an implementation of `Display`.
1391
    ///
1392
    /// Serializers that use `no_std` are required to provide an implementation
1393
    /// of this method. If no more sensible behavior is possible, the
1394
    /// implementation is expected to return an error.
1395
    ///
1396
    /// ```edition2018
1397
    /// # struct DateTime;
1398
    /// #
1399
    /// # impl DateTime {
1400
    /// #     fn naive_local(&self) -> () { () }
1401
    /// #     fn offset(&self) -> () { () }
1402
    /// # }
1403
    /// #
1404
    /// use serde::{Serialize, Serializer};
1405
    ///
1406
    /// impl Serialize for DateTime {
1407
    ///     fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
1408
    ///     where
1409
    ///         S: Serializer,
1410
    ///     {
1411
    ///         serializer.collect_str(&format_args!("{:?}{:?}",
1412
    ///                                              self.naive_local(),
1413
    ///                                              self.offset()))
1414
    ///     }
1415
    /// }
1416
    /// ```
1417
    #[cfg(not(any(feature = "std", feature = "alloc")))]
1418
    fn collect_str<T: ?Sized>(self, value: &T) -> Result<Self::Ok, Self::Error>
1419
    where
1420
        T: Display;
1421
1422
    /// Determine whether `Serialize` implementations should serialize in
1423
    /// human-readable form.
1424
    ///
1425
    /// Some types have a human-readable form that may be somewhat expensive to
1426
    /// construct, as well as a binary form that is compact and efficient.
1427
    /// Generally text-based formats like JSON and YAML will prefer to use the
1428
    /// human-readable one and binary formats like Postcard will prefer the
1429
    /// compact one.
1430
    ///
1431
    /// ```edition2018
1432
    /// # use std::fmt::{self, Display};
1433
    /// #
1434
    /// # struct Timestamp;
1435
    /// #
1436
    /// # impl Timestamp {
1437
    /// #     fn seconds_since_epoch(&self) -> u64 { unimplemented!() }
1438
    /// # }
1439
    /// #
1440
    /// # impl Display for Timestamp {
1441
    /// #     fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
1442
    /// #         unimplemented!()
1443
    /// #     }
1444
    /// # }
1445
    /// #
1446
    /// use serde::{Serialize, Serializer};
1447
    ///
1448
    /// impl Serialize for Timestamp {
1449
    ///     fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
1450
    ///     where
1451
    ///         S: Serializer,
1452
    ///     {
1453
    ///         if serializer.is_human_readable() {
1454
    ///             // Serialize to a human-readable string "2015-05-15T17:01:00Z".
1455
    ///             self.to_string().serialize(serializer)
1456
    ///         } else {
1457
    ///             // Serialize to a compact binary representation.
1458
    ///             self.seconds_since_epoch().serialize(serializer)
1459
    ///         }
1460
    ///     }
1461
    /// }
1462
    /// ```
1463
    ///
1464
    /// The default implementation of this method returns `true`. Data formats
1465
    /// may override this to `false` to request a compact form for types that
1466
    /// support one. Note that modifying this method to change a format from
1467
    /// human-readable to compact or vice versa should be regarded as a breaking
1468
    /// change, as a value serialized in human-readable mode is not required to
1469
    /// deserialize from the same data in compact mode.
1470
    #[inline]
1471
0
    fn is_human_readable(&self) -> bool {
1472
0
        true
1473
0
    }
Unexecuted instantiation: <serde_json::ser::MapKeySerializer<&mut alloc::vec::Vec<u8>, serde_json::ser::PrettyFormatter> as serde::ser::Serializer>::is_human_readable
Unexecuted instantiation: <&mut serde_json::ser::Serializer<&mut alloc::vec::Vec<u8>, serde_json::ser::PrettyFormatter> as serde::ser::Serializer>::is_human_readable
Unexecuted instantiation: <_ as serde::ser::Serializer>::is_human_readable
1474
}
1475
1476
/// Returned from `Serializer::serialize_seq`.
1477
///
1478
/// # Example use
1479
///
1480
/// ```edition2018
1481
/// # use std::marker::PhantomData;
1482
/// #
1483
/// # struct Vec<T>(PhantomData<T>);
1484
/// #
1485
/// # impl<T> Vec<T> {
1486
/// #     fn len(&self) -> usize {
1487
/// #         unimplemented!()
1488
/// #     }
1489
/// # }
1490
/// #
1491
/// # impl<'a, T> IntoIterator for &'a Vec<T> {
1492
/// #     type Item = &'a T;
1493
/// #     type IntoIter = Box<Iterator<Item = &'a T>>;
1494
/// #     fn into_iter(self) -> Self::IntoIter {
1495
/// #         unimplemented!()
1496
/// #     }
1497
/// # }
1498
/// #
1499
/// use serde::ser::{Serialize, Serializer, SerializeSeq};
1500
///
1501
/// impl<T> Serialize for Vec<T>
1502
/// where
1503
///     T: Serialize,
1504
/// {
1505
///     fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
1506
///     where
1507
///         S: Serializer,
1508
///     {
1509
///         let mut seq = serializer.serialize_seq(Some(self.len()))?;
1510
///         for element in self {
1511
///             seq.serialize_element(element)?;
1512
///         }
1513
///         seq.end()
1514
///     }
1515
/// }
1516
/// ```
1517
///
1518
/// # Example implementation
1519
///
1520
/// The [example data format] presented on the website demonstrates an
1521
/// implementation of `SerializeSeq` for a basic JSON data format.
1522
///
1523
/// [example data format]: https://serde.rs/data-format.html
1524
pub trait SerializeSeq {
1525
    /// Must match the `Ok` type of our `Serializer`.
1526
    type Ok;
1527
1528
    /// Must match the `Error` type of our `Serializer`.
1529
    type Error: Error;
1530
1531
    /// Serialize a sequence element.
1532
    fn serialize_element<T: ?Sized>(&mut self, value: &T) -> Result<(), Self::Error>
1533
    where
1534
        T: Serialize;
1535
1536
    /// Finish serializing a sequence.
1537
    fn end(self) -> Result<Self::Ok, Self::Error>;
1538
}
1539
1540
/// Returned from `Serializer::serialize_tuple`.
1541
///
1542
/// # Example use
1543
///
1544
/// ```edition2018
1545
/// use serde::ser::{Serialize, Serializer, SerializeTuple};
1546
///
1547
/// # mod fool {
1548
/// #     trait Serialize {}
1549
/// impl<A, B, C> Serialize for (A, B, C)
1550
/// #     {}
1551
/// # }
1552
/// #
1553
/// # struct Tuple3<A, B, C>(A, B, C);
1554
/// #
1555
/// # impl<A, B, C> Serialize for Tuple3<A, B, C>
1556
/// where
1557
///     A: Serialize,
1558
///     B: Serialize,
1559
///     C: Serialize,
1560
/// {
1561
///     fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
1562
///     where
1563
///         S: Serializer,
1564
///     {
1565
///         let mut tup = serializer.serialize_tuple(3)?;
1566
///         tup.serialize_element(&self.0)?;
1567
///         tup.serialize_element(&self.1)?;
1568
///         tup.serialize_element(&self.2)?;
1569
///         tup.end()
1570
///     }
1571
/// }
1572
/// ```
1573
///
1574
/// ```edition2018
1575
/// # use std::marker::PhantomData;
1576
/// #
1577
/// # struct Array<T>(PhantomData<T>);
1578
/// #
1579
/// # impl<T> Array<T> {
1580
/// #     fn len(&self) -> usize {
1581
/// #         unimplemented!()
1582
/// #     }
1583
/// # }
1584
/// #
1585
/// # impl<'a, T> IntoIterator for &'a Array<T> {
1586
/// #     type Item = &'a T;
1587
/// #     type IntoIter = Box<Iterator<Item = &'a T>>;
1588
/// #     fn into_iter(self) -> Self::IntoIter {
1589
/// #         unimplemented!()
1590
/// #     }
1591
/// # }
1592
/// #
1593
/// use serde::ser::{Serialize, Serializer, SerializeTuple};
1594
///
1595
/// # mod fool {
1596
/// #     trait Serialize {}
1597
/// impl<T> Serialize for [T; 16]
1598
/// #     {}
1599
/// # }
1600
/// #
1601
/// # impl<T> Serialize for Array<T>
1602
/// where
1603
///     T: Serialize,
1604
/// {
1605
///     fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
1606
///     where
1607
///         S: Serializer,
1608
///     {
1609
///         let mut seq = serializer.serialize_tuple(16)?;
1610
///         for element in self {
1611
///             seq.serialize_element(element)?;
1612
///         }
1613
///         seq.end()
1614
///     }
1615
/// }
1616
/// ```
1617
///
1618
/// # Example implementation
1619
///
1620
/// The [example data format] presented on the website demonstrates an
1621
/// implementation of `SerializeTuple` for a basic JSON data format.
1622
///
1623
/// [example data format]: https://serde.rs/data-format.html
1624
pub trait SerializeTuple {
1625
    /// Must match the `Ok` type of our `Serializer`.
1626
    type Ok;
1627
1628
    /// Must match the `Error` type of our `Serializer`.
1629
    type Error: Error;
1630
1631
    /// Serialize a tuple element.
1632
    fn serialize_element<T: ?Sized>(&mut self, value: &T) -> Result<(), Self::Error>
1633
    where
1634
        T: Serialize;
1635
1636
    /// Finish serializing a tuple.
1637
    fn end(self) -> Result<Self::Ok, Self::Error>;
1638
}
1639
1640
/// Returned from `Serializer::serialize_tuple_struct`.
1641
///
1642
/// # Example use
1643
///
1644
/// ```edition2018
1645
/// use serde::ser::{Serialize, SerializeTupleStruct, Serializer};
1646
///
1647
/// struct Rgb(u8, u8, u8);
1648
///
1649
/// impl Serialize for Rgb {
1650
///     fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
1651
///     where
1652
///         S: Serializer,
1653
///     {
1654
///         let mut ts = serializer.serialize_tuple_struct("Rgb", 3)?;
1655
///         ts.serialize_field(&self.0)?;
1656
///         ts.serialize_field(&self.1)?;
1657
///         ts.serialize_field(&self.2)?;
1658
///         ts.end()
1659
///     }
1660
/// }
1661
/// ```
1662
///
1663
/// # Example implementation
1664
///
1665
/// The [example data format] presented on the website demonstrates an
1666
/// implementation of `SerializeTupleStruct` for a basic JSON data format.
1667
///
1668
/// [example data format]: https://serde.rs/data-format.html
1669
pub trait SerializeTupleStruct {
1670
    /// Must match the `Ok` type of our `Serializer`.
1671
    type Ok;
1672
1673
    /// Must match the `Error` type of our `Serializer`.
1674
    type Error: Error;
1675
1676
    /// Serialize a tuple struct field.
1677
    fn serialize_field<T: ?Sized>(&mut self, value: &T) -> Result<(), Self::Error>
1678
    where
1679
        T: Serialize;
1680
1681
    /// Finish serializing a tuple struct.
1682
    fn end(self) -> Result<Self::Ok, Self::Error>;
1683
}
1684
1685
/// Returned from `Serializer::serialize_tuple_variant`.
1686
///
1687
/// # Example use
1688
///
1689
/// ```edition2018
1690
/// use serde::ser::{Serialize, SerializeTupleVariant, Serializer};
1691
///
1692
/// enum E {
1693
///     T(u8, u8),
1694
///     U(String, u32, u32),
1695
/// }
1696
///
1697
/// impl Serialize for E {
1698
///     fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
1699
///     where
1700
///         S: Serializer,
1701
///     {
1702
///         match *self {
1703
///             E::T(ref a, ref b) => {
1704
///                 let mut tv = serializer.serialize_tuple_variant("E", 0, "T", 2)?;
1705
///                 tv.serialize_field(a)?;
1706
///                 tv.serialize_field(b)?;
1707
///                 tv.end()
1708
///             }
1709
///             E::U(ref a, ref b, ref c) => {
1710
///                 let mut tv = serializer.serialize_tuple_variant("E", 1, "U", 3)?;
1711
///                 tv.serialize_field(a)?;
1712
///                 tv.serialize_field(b)?;
1713
///                 tv.serialize_field(c)?;
1714
///                 tv.end()
1715
///             }
1716
///         }
1717
///     }
1718
/// }
1719
/// ```
1720
///
1721
/// # Example implementation
1722
///
1723
/// The [example data format] presented on the website demonstrates an
1724
/// implementation of `SerializeTupleVariant` for a basic JSON data format.
1725
///
1726
/// [example data format]: https://serde.rs/data-format.html
1727
pub trait SerializeTupleVariant {
1728
    /// Must match the `Ok` type of our `Serializer`.
1729
    type Ok;
1730
1731
    /// Must match the `Error` type of our `Serializer`.
1732
    type Error: Error;
1733
1734
    /// Serialize a tuple variant field.
1735
    fn serialize_field<T: ?Sized>(&mut self, value: &T) -> Result<(), Self::Error>
1736
    where
1737
        T: Serialize;
1738
1739
    /// Finish serializing a tuple variant.
1740
    fn end(self) -> Result<Self::Ok, Self::Error>;
1741
}
1742
1743
/// Returned from `Serializer::serialize_map`.
1744
///
1745
/// # Example use
1746
///
1747
/// ```edition2018
1748
/// # use std::marker::PhantomData;
1749
/// #
1750
/// # struct HashMap<K, V>(PhantomData<K>, PhantomData<V>);
1751
/// #
1752
/// # impl<K, V> HashMap<K, V> {
1753
/// #     fn len(&self) -> usize {
1754
/// #         unimplemented!()
1755
/// #     }
1756
/// # }
1757
/// #
1758
/// # impl<'a, K, V> IntoIterator for &'a HashMap<K, V> {
1759
/// #     type Item = (&'a K, &'a V);
1760
/// #     type IntoIter = Box<Iterator<Item = (&'a K, &'a V)>>;
1761
/// #
1762
/// #     fn into_iter(self) -> Self::IntoIter {
1763
/// #         unimplemented!()
1764
/// #     }
1765
/// # }
1766
/// #
1767
/// use serde::ser::{Serialize, Serializer, SerializeMap};
1768
///
1769
/// impl<K, V> Serialize for HashMap<K, V>
1770
/// where
1771
///     K: Serialize,
1772
///     V: Serialize,
1773
/// {
1774
///     fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
1775
///     where
1776
///         S: Serializer,
1777
///     {
1778
///         let mut map = serializer.serialize_map(Some(self.len()))?;
1779
///         for (k, v) in self {
1780
///             map.serialize_entry(k, v)?;
1781
///         }
1782
///         map.end()
1783
///     }
1784
/// }
1785
/// ```
1786
///
1787
/// # Example implementation
1788
///
1789
/// The [example data format] presented on the website demonstrates an
1790
/// implementation of `SerializeMap` for a basic JSON data format.
1791
///
1792
/// [example data format]: https://serde.rs/data-format.html
1793
pub trait SerializeMap {
1794
    /// Must match the `Ok` type of our `Serializer`.
1795
    type Ok;
1796
1797
    /// Must match the `Error` type of our `Serializer`.
1798
    type Error: Error;
1799
1800
    /// Serialize a map key.
1801
    ///
1802
    /// If possible, `Serialize` implementations are encouraged to use
1803
    /// `serialize_entry` instead as it may be implemented more efficiently in
1804
    /// some formats compared to a pair of calls to `serialize_key` and
1805
    /// `serialize_value`.
1806
    fn serialize_key<T: ?Sized>(&mut self, key: &T) -> Result<(), Self::Error>
1807
    where
1808
        T: Serialize;
1809
1810
    /// Serialize a map value.
1811
    ///
1812
    /// # Panics
1813
    ///
1814
    /// Calling `serialize_value` before `serialize_key` is incorrect and is
1815
    /// allowed to panic or produce bogus results.
1816
    fn serialize_value<T: ?Sized>(&mut self, value: &T) -> Result<(), Self::Error>
1817
    where
1818
        T: Serialize;
1819
1820
    /// Serialize a map entry consisting of a key and a value.
1821
    ///
1822
    /// Some [`Serialize`] types are not able to hold a key and value in memory
1823
    /// at the same time so `SerializeMap` implementations are required to
1824
    /// support [`serialize_key`] and [`serialize_value`] individually. The
1825
    /// `serialize_entry` method allows serializers to optimize for the case
1826
    /// where key and value are both available. [`Serialize`] implementations
1827
    /// are encouraged to use `serialize_entry` if possible.
1828
    ///
1829
    /// The default implementation delegates to [`serialize_key`] and
1830
    /// [`serialize_value`]. This is appropriate for serializers that do not
1831
    /// care about performance or are not able to optimize `serialize_entry` any
1832
    /// better than this.
1833
    ///
1834
    /// [`Serialize`]: ../trait.Serialize.html
1835
    /// [`serialize_key`]: #tymethod.serialize_key
1836
    /// [`serialize_value`]: #tymethod.serialize_value
1837
0
    fn serialize_entry<K: ?Sized, V: ?Sized>(
1838
0
        &mut self,
1839
0
        key: &K,
1840
0
        value: &V,
1841
0
    ) -> Result<(), Self::Error>
1842
0
    where
1843
0
        K: Serialize,
1844
0
        V: Serialize,
1845
    {
1846
0
        try!(self.serialize_key(key));
1847
0
        self.serialize_value(value)
1848
0
    }
Unexecuted instantiation: <serde_json::ser::Compound<&mut alloc::vec::Vec<u8>, serde_json::ser::CompactFormatter> as serde::ser::SerializeMap>::serialize_entry::<str, alloc::vec::Vec<audio_processor::config::Processor>>
Unexecuted instantiation: <serde_json::ser::Compound<&mut alloc::vec::Vec<u8>, serde_json::ser::CompactFormatter> as serde::ser::SerializeMap>::serialize_entry::<str, alloc::vec::Vec<usize>>
Unexecuted instantiation: <serde_json::ser::Compound<&mut alloc::vec::Vec<u8>, serde_json::ser::CompactFormatter> as serde::ser::SerializeMap>::serialize_entry::<str, alloc::boxed::Box<audio_processor::config::Processor>>
Unexecuted instantiation: <serde_json::ser::Compound<&mut alloc::vec::Vec<u8>, serde_json::ser::CompactFormatter> as serde::ser::SerializeMap>::serialize_entry::<str, core::option::Option<usize>>
Unexecuted instantiation: <serde_json::ser::Compound<&mut alloc::vec::Vec<u8>, serde_json::ser::CompactFormatter> as serde::ser::SerializeMap>::serialize_entry::<str, alloc::string::String>
Unexecuted instantiation: <serde_json::ser::Compound<&mut alloc::vec::Vec<u8>, serde_json::ser::CompactFormatter> as serde::ser::SerializeMap>::serialize_entry::<str, audio_processor::shape::Format>
Unexecuted instantiation: <serde_json::ser::Compound<&mut alloc::vec::Vec<u8>, serde_json::ser::CompactFormatter> as serde::ser::SerializeMap>::serialize_entry::<str, audio_processor::config::Processor>
Unexecuted instantiation: <serde_json::ser::Compound<&mut alloc::vec::Vec<u8>, serde_json::ser::CompactFormatter> as serde::ser::SerializeMap>::serialize_entry::<str, std::path::PathBuf>
Unexecuted instantiation: <serde_json::ser::Compound<&mut alloc::vec::Vec<u8>, serde_json::ser::CompactFormatter> as serde::ser::SerializeMap>::serialize_entry::<str, bool>
Unexecuted instantiation: <serde_json::ser::Compound<&mut alloc::vec::Vec<u8>, serde_json::ser::CompactFormatter> as serde::ser::SerializeMap>::serialize_entry::<str, usize>
Unexecuted instantiation: <serde_json::ser::Compound<&mut alloc::vec::Vec<u8>, serde_json::ser::CompactFormatter> as serde::ser::SerializeMap>::serialize_entry::<&alloc::string::String, &alloc::string::String>
Unexecuted instantiation: <serde_json::ser::Compound<&mut alloc::vec::Vec<u8>, serde_json::ser::PrettyFormatter> as serde::ser::SerializeMap>::serialize_entry::<&alloc::string::String, &alloc::string::String>
Unexecuted instantiation: <serde_json::ser::Compound<&mut alloc::vec::Vec<u8>, serde_json::ser::PrettyFormatter> as serde::ser::SerializeMap>::serialize_entry::<&cras_common::types_internal::CRAS_NC_PROVIDER, &cras_s2::AudioEffectStatus>
Unexecuted instantiation: <serde_json::ser::Compound<&mut alloc::vec::Vec<u8>, serde_json::ser::PrettyFormatter> as serde::ser::SerializeMap>::serialize_entry::<str, core::option::Option<alloc::vec::Vec<alloc::string::String>>>
Unexecuted instantiation: <serde_json::ser::Compound<&mut alloc::vec::Vec<u8>, serde_json::ser::PrettyFormatter> as serde::ser::SerializeMap>::serialize_entry::<str, std::collections::hash::map::HashMap<alloc::string::String, alloc::string::String>>
Unexecuted instantiation: <serde_json::ser::Compound<&mut alloc::vec::Vec<u8>, serde_json::ser::PrettyFormatter> as serde::ser::SerializeMap>::serialize_entry::<str, std::collections::hash::map::HashMap<cras_common::types_internal::CRAS_NC_PROVIDER, cras_s2::AudioEffectStatus>>
Unexecuted instantiation: <serde_json::ser::Compound<&mut alloc::vec::Vec<u8>, serde_json::ser::PrettyFormatter> as serde::ser::SerializeMap>::serialize_entry::<str, std::collections::hash::set::HashSet<alloc::string::String>>
Unexecuted instantiation: <serde_json::ser::Compound<&mut alloc::vec::Vec<u8>, serde_json::ser::PrettyFormatter> as serde::ser::SerializeMap>::serialize_entry::<str, cras_s2::Input>
Unexecuted instantiation: <serde_json::ser::Compound<&mut alloc::vec::Vec<u8>, serde_json::ser::PrettyFormatter> as serde::ser::SerializeMap>::serialize_entry::<str, cras_s2::Output>
Unexecuted instantiation: <serde_json::ser::Compound<&mut alloc::vec::Vec<u8>, serde_json::ser::PrettyFormatter> as serde::ser::SerializeMap>::serialize_entry::<str, cras_feature_tier::CrasFeatureTier>
Unexecuted instantiation: <serde_json::ser::Compound<&mut alloc::vec::Vec<u8>, serde_json::ser::PrettyFormatter> as serde::ser::SerializeMap>::serialize_entry::<str, alloc::string::String>
Unexecuted instantiation: <serde_json::ser::Compound<&mut alloc::vec::Vec<u8>, serde_json::ser::PrettyFormatter> as serde::ser::SerializeMap>::serialize_entry::<str, cras_s2::processing::BeamformingConfig>
Unexecuted instantiation: <serde_json::ser::Compound<&mut alloc::vec::Vec<u8>, serde_json::ser::PrettyFormatter> as serde::ser::SerializeMap>::serialize_entry::<str, cras_common::types_internal::EFFECT_TYPE>
Unexecuted instantiation: <serde_json::ser::Compound<&mut alloc::vec::Vec<u8>, serde_json::ser::PrettyFormatter> as serde::ser::SerializeMap>::serialize_entry::<str, cras_common::types_internal::CRAS_NC_PROVIDER>
Unexecuted instantiation: <serde_json::ser::Compound<&mut alloc::vec::Vec<u8>, serde_json::ser::PrettyFormatter> as serde::ser::SerializeMap>::serialize_entry::<str, cras_common::types_internal::CrasEffectUIAppearance>
Unexecuted instantiation: <serde_json::ser::Compound<&mut alloc::vec::Vec<u8>, serde_json::ser::PrettyFormatter> as serde::ser::SerializeMap>::serialize_entry::<str, std::path::PathBuf>
Unexecuted instantiation: <serde_json::ser::Compound<&mut alloc::vec::Vec<u8>, serde_json::ser::PrettyFormatter> as serde::ser::SerializeMap>::serialize_entry::<str, &str>
Unexecuted instantiation: <serde_json::ser::Compound<&mut alloc::vec::Vec<u8>, serde_json::ser::PrettyFormatter> as serde::ser::SerializeMap>::serialize_entry::<str, bool>
Unexecuted instantiation: <_ as serde::ser::SerializeMap>::serialize_entry::<_, _>
Unexecuted instantiation: <serde_json::ser::Compound<&mut <serde_json::value::Value as core::fmt::Display>::fmt::WriterFormatter, serde_json::ser::PrettyFormatter> as serde::ser::SerializeMap>::serialize_entry::<alloc::string::String, serde_json::value::Value>
Unexecuted instantiation: <serde_json::ser::Compound<&mut <serde_json::value::Value as core::fmt::Display>::fmt::WriterFormatter, serde_json::ser::CompactFormatter> as serde::ser::SerializeMap>::serialize_entry::<alloc::string::String, serde_json::value::Value>
1849
1850
    /// Finish serializing a map.
1851
    fn end(self) -> Result<Self::Ok, Self::Error>;
1852
}
1853
1854
/// Returned from `Serializer::serialize_struct`.
1855
///
1856
/// # Example use
1857
///
1858
/// ```edition2018
1859
/// use serde::ser::{Serialize, SerializeStruct, Serializer};
1860
///
1861
/// struct Rgb {
1862
///     r: u8,
1863
///     g: u8,
1864
///     b: u8,
1865
/// }
1866
///
1867
/// impl Serialize for Rgb {
1868
///     fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
1869
///     where
1870
///         S: Serializer,
1871
///     {
1872
///         let mut rgb = serializer.serialize_struct("Rgb", 3)?;
1873
///         rgb.serialize_field("r", &self.r)?;
1874
///         rgb.serialize_field("g", &self.g)?;
1875
///         rgb.serialize_field("b", &self.b)?;
1876
///         rgb.end()
1877
///     }
1878
/// }
1879
/// ```
1880
///
1881
/// # Example implementation
1882
///
1883
/// The [example data format] presented on the website demonstrates an
1884
/// implementation of `SerializeStruct` for a basic JSON data format.
1885
///
1886
/// [example data format]: https://serde.rs/data-format.html
1887
pub trait SerializeStruct {
1888
    /// Must match the `Ok` type of our `Serializer`.
1889
    type Ok;
1890
1891
    /// Must match the `Error` type of our `Serializer`.
1892
    type Error: Error;
1893
1894
    /// Serialize a struct field.
1895
    fn serialize_field<T: ?Sized>(
1896
        &mut self,
1897
        key: &'static str,
1898
        value: &T,
1899
    ) -> Result<(), Self::Error>
1900
    where
1901
        T: Serialize;
1902
1903
    /// Indicate that a struct field has been skipped.
1904
    #[inline]
1905
0
    fn skip_field(&mut self, key: &'static str) -> Result<(), Self::Error> {
1906
0
        let _ = key;
1907
0
        Ok(())
1908
0
    }
1909
1910
    /// Finish serializing a struct.
1911
    fn end(self) -> Result<Self::Ok, Self::Error>;
1912
}
1913
1914
/// Returned from `Serializer::serialize_struct_variant`.
1915
///
1916
/// # Example use
1917
///
1918
/// ```edition2018
1919
/// use serde::ser::{Serialize, SerializeStructVariant, Serializer};
1920
///
1921
/// enum E {
1922
///     S { r: u8, g: u8, b: u8 },
1923
/// }
1924
///
1925
/// impl Serialize for E {
1926
///     fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
1927
///     where
1928
///         S: Serializer,
1929
///     {
1930
///         match *self {
1931
///             E::S {
1932
///                 ref r,
1933
///                 ref g,
1934
///                 ref b,
1935
///             } => {
1936
///                 let mut sv = serializer.serialize_struct_variant("E", 0, "S", 3)?;
1937
///                 sv.serialize_field("r", r)?;
1938
///                 sv.serialize_field("g", g)?;
1939
///                 sv.serialize_field("b", b)?;
1940
///                 sv.end()
1941
///             }
1942
///         }
1943
///     }
1944
/// }
1945
/// ```
1946
///
1947
/// # Example implementation
1948
///
1949
/// The [example data format] presented on the website demonstrates an
1950
/// implementation of `SerializeStructVariant` for a basic JSON data format.
1951
///
1952
/// [example data format]: https://serde.rs/data-format.html
1953
pub trait SerializeStructVariant {
1954
    /// Must match the `Ok` type of our `Serializer`.
1955
    type Ok;
1956
1957
    /// Must match the `Error` type of our `Serializer`.
1958
    type Error: Error;
1959
1960
    /// Serialize a struct variant field.
1961
    fn serialize_field<T: ?Sized>(
1962
        &mut self,
1963
        key: &'static str,
1964
        value: &T,
1965
    ) -> Result<(), Self::Error>
1966
    where
1967
        T: Serialize;
1968
1969
    /// Indicate that a struct variant field has been skipped.
1970
    #[inline]
1971
0
    fn skip_field(&mut self, key: &'static str) -> Result<(), Self::Error> {
1972
0
        let _ = key;
1973
0
        Ok(())
1974
0
    }
1975
1976
    /// Finish serializing a struct variant.
1977
    fn end(self) -> Result<Self::Ok, Self::Error>;
1978
}
1979
1980
0
fn iterator_len_hint<I>(iter: &I) -> Option<usize>
1981
0
where
1982
0
    I: Iterator,
1983
{
1984
0
    match iter.size_hint() {
1985
0
        (lo, Some(hi)) if lo == hi => Some(lo),
1986
0
        _ => None,
1987
    }
1988
0
}
Unexecuted instantiation: serde::ser::iterator_len_hint::<core::slice::iter::Iter<audio_processor::config::Processor>>
Unexecuted instantiation: serde::ser::iterator_len_hint::<core::slice::iter::Iter<usize>>
Unexecuted instantiation: serde::ser::iterator_len_hint::<std::collections::hash::map::Iter<alloc::string::String, alloc::string::String>>
Unexecuted instantiation: serde::ser::iterator_len_hint::<core::slice::iter::Iter<alloc::string::String>>
Unexecuted instantiation: serde::ser::iterator_len_hint::<std::collections::hash::map::Iter<alloc::string::String, alloc::string::String>>
Unexecuted instantiation: serde::ser::iterator_len_hint::<std::collections::hash::map::Iter<cras_common::types_internal::CRAS_NC_PROVIDER, cras_s2::AudioEffectStatus>>
Unexecuted instantiation: serde::ser::iterator_len_hint::<std::collections::hash::set::Iter<alloc::string::String>>
Unexecuted instantiation: serde::ser::iterator_len_hint::<_>
Unexecuted instantiation: serde::ser::iterator_len_hint::<core::slice::iter::Iter<serde_json::value::Value>>