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\> *(if* features = \["rc"\] *is enabled)*
65 //! - Arc\<T\> *(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 crate::lib::*;
111
112 mod fmt;
113 mod impls;
114 mod impossible;
115
116 pub use self::impossible::Impossible;
117
118 #[cfg(not(any(feature = "std", feature = "unstable")))]
119 #[doc(no_inline)]
120 pub use crate::std_error::Error as StdError;
121 #[cfg(all(feature = "unstable", not(feature = "std")))]
122 #[doc(no_inline)]
123 pub use core::error::Error as StdError;
124 #[cfg(feature = "std")]
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 /// ```edition2021
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 /// ```edition2021
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
serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> where S: Serializer249 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 /// ```edition2021
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 /// ```
serialize_bool(self, v: bool) -> Result<Self::Ok, Self::Error>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 /// ```edition2021
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 /// ```
serialize_i8(self, v: i8) -> Result<Self::Ok, Self::Error>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 /// ```edition2021
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 /// ```
serialize_i16(self, v: i16) -> Result<Self::Ok, Self::Error>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 /// ```edition2021
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 /// ```
serialize_i32(self, v: i32) -> Result<Self::Ok, Self::Error>471 fn serialize_i32(self, v: i32) -> Result<Self::Ok, Self::Error>;
472
473 /// Serialize an `i64` value.
474 ///
475 /// ```edition2021
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 /// ```
serialize_i64(self, v: i64) -> Result<Self::Ok, Self::Error>489 fn serialize_i64(self, v: i64) -> Result<Self::Ok, Self::Error>;
490
491 /// Serialize an `i128` value.
492 ///
493 /// ```edition2021
494 /// # use serde::Serializer;
495 /// #
496 /// # serde::__private_serialize!();
497 /// #
498 /// impl Serialize for i128 {
499 /// fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
500 /// where
501 /// S: Serializer,
502 /// {
503 /// serializer.serialize_i128(*self)
504 /// }
505 /// }
506 /// ```
507 ///
508 /// The default behavior unconditionally returns an error.
serialize_i128(self, v: i128) -> Result<Self::Ok, Self::Error>509 fn serialize_i128(self, v: i128) -> Result<Self::Ok, Self::Error> {
510 let _ = v;
511 Err(Error::custom("i128 is not supported"))
512 }
513
514 /// Serialize a `u8` value.
515 ///
516 /// If the format does not differentiate between `u8` and `u64`, a
517 /// reasonable implementation would be to cast the value to `u64` and
518 /// forward to `serialize_u64`.
519 ///
520 /// ```edition2021
521 /// # use serde::Serializer;
522 /// #
523 /// # serde::__private_serialize!();
524 /// #
525 /// impl Serialize for u8 {
526 /// fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
527 /// where
528 /// S: Serializer,
529 /// {
530 /// serializer.serialize_u8(*self)
531 /// }
532 /// }
533 /// ```
serialize_u8(self, v: u8) -> Result<Self::Ok, Self::Error>534 fn serialize_u8(self, v: u8) -> Result<Self::Ok, Self::Error>;
535
536 /// Serialize a `u16` value.
537 ///
538 /// If the format does not differentiate between `u16` and `u64`, a
539 /// reasonable implementation would be to cast the value to `u64` and
540 /// forward to `serialize_u64`.
541 ///
542 /// ```edition2021
543 /// # use serde::Serializer;
544 /// #
545 /// # serde::__private_serialize!();
546 /// #
547 /// impl Serialize for u16 {
548 /// fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
549 /// where
550 /// S: Serializer,
551 /// {
552 /// serializer.serialize_u16(*self)
553 /// }
554 /// }
555 /// ```
serialize_u16(self, v: u16) -> Result<Self::Ok, Self::Error>556 fn serialize_u16(self, v: u16) -> Result<Self::Ok, Self::Error>;
557
558 /// Serialize a `u32` value.
559 ///
560 /// If the format does not differentiate between `u32` and `u64`, a
561 /// reasonable implementation would be to cast the value to `u64` and
562 /// forward to `serialize_u64`.
563 ///
564 /// ```edition2021
565 /// # use serde::Serializer;
566 /// #
567 /// # serde::__private_serialize!();
568 /// #
569 /// impl Serialize for u32 {
570 /// fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
571 /// where
572 /// S: Serializer,
573 /// {
574 /// serializer.serialize_u32(*self)
575 /// }
576 /// }
577 /// ```
serialize_u32(self, v: u32) -> Result<Self::Ok, Self::Error>578 fn serialize_u32(self, v: u32) -> Result<Self::Ok, Self::Error>;
579
580 /// Serialize a `u64` value.
581 ///
582 /// ```edition2021
583 /// # use serde::Serializer;
584 /// #
585 /// # serde::__private_serialize!();
586 /// #
587 /// impl Serialize for u64 {
588 /// fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
589 /// where
590 /// S: Serializer,
591 /// {
592 /// serializer.serialize_u64(*self)
593 /// }
594 /// }
595 /// ```
serialize_u64(self, v: u64) -> Result<Self::Ok, Self::Error>596 fn serialize_u64(self, v: u64) -> Result<Self::Ok, Self::Error>;
597
598 /// Serialize a `u128` value.
599 ///
600 /// ```edition2021
601 /// # use serde::Serializer;
602 /// #
603 /// # serde::__private_serialize!();
604 /// #
605 /// impl Serialize for u128 {
606 /// fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
607 /// where
608 /// S: Serializer,
609 /// {
610 /// serializer.serialize_u128(*self)
611 /// }
612 /// }
613 /// ```
614 ///
615 /// The default behavior unconditionally returns an error.
serialize_u128(self, v: u128) -> Result<Self::Ok, Self::Error>616 fn serialize_u128(self, v: u128) -> Result<Self::Ok, Self::Error> {
617 let _ = v;
618 Err(Error::custom("u128 is not supported"))
619 }
620
621 /// Serialize an `f32` value.
622 ///
623 /// If the format does not differentiate between `f32` and `f64`, a
624 /// reasonable implementation would be to cast the value to `f64` and
625 /// forward to `serialize_f64`.
626 ///
627 /// ```edition2021
628 /// # use serde::Serializer;
629 /// #
630 /// # serde::__private_serialize!();
631 /// #
632 /// impl Serialize for f32 {
633 /// fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
634 /// where
635 /// S: Serializer,
636 /// {
637 /// serializer.serialize_f32(*self)
638 /// }
639 /// }
640 /// ```
serialize_f32(self, v: f32) -> Result<Self::Ok, Self::Error>641 fn serialize_f32(self, v: f32) -> Result<Self::Ok, Self::Error>;
642
643 /// Serialize an `f64` value.
644 ///
645 /// ```edition2021
646 /// # use serde::Serializer;
647 /// #
648 /// # serde::__private_serialize!();
649 /// #
650 /// impl Serialize for f64 {
651 /// fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
652 /// where
653 /// S: Serializer,
654 /// {
655 /// serializer.serialize_f64(*self)
656 /// }
657 /// }
658 /// ```
serialize_f64(self, v: f64) -> Result<Self::Ok, Self::Error>659 fn serialize_f64(self, v: f64) -> Result<Self::Ok, Self::Error>;
660
661 /// Serialize a character.
662 ///
663 /// If the format does not support characters, it is reasonable to serialize
664 /// it as a single element `str` or a `u32`.
665 ///
666 /// ```edition2021
667 /// # use serde::Serializer;
668 /// #
669 /// # serde::__private_serialize!();
670 /// #
671 /// impl Serialize for char {
672 /// fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
673 /// where
674 /// S: Serializer,
675 /// {
676 /// serializer.serialize_char(*self)
677 /// }
678 /// }
679 /// ```
serialize_char(self, v: char) -> Result<Self::Ok, Self::Error>680 fn serialize_char(self, v: char) -> Result<Self::Ok, Self::Error>;
681
682 /// Serialize a `&str`.
683 ///
684 /// ```edition2021
685 /// # use serde::Serializer;
686 /// #
687 /// # serde::__private_serialize!();
688 /// #
689 /// impl Serialize for str {
690 /// fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
691 /// where
692 /// S: Serializer,
693 /// {
694 /// serializer.serialize_str(self)
695 /// }
696 /// }
697 /// ```
serialize_str(self, v: &str) -> Result<Self::Ok, Self::Error>698 fn serialize_str(self, v: &str) -> Result<Self::Ok, Self::Error>;
699
700 /// Serialize a chunk of raw byte data.
701 ///
702 /// Enables serializers to serialize byte slices more compactly or more
703 /// efficiently than other types of slices. If no efficient implementation
704 /// is available, a reasonable implementation would be to forward to
705 /// `serialize_seq`. If forwarded, the implementation looks usually just
706 /// like this:
707 ///
708 /// ```edition2021
709 /// # use serde::ser::{Serializer, SerializeSeq};
710 /// # use serde::__private::doc::Error;
711 /// #
712 /// # struct MySerializer;
713 /// #
714 /// # impl Serializer for MySerializer {
715 /// # type Ok = ();
716 /// # type Error = Error;
717 /// #
718 /// fn serialize_bytes(self, v: &[u8]) -> Result<Self::Ok, Self::Error> {
719 /// let mut seq = self.serialize_seq(Some(v.len()))?;
720 /// for b in v {
721 /// seq.serialize_element(b)?;
722 /// }
723 /// seq.end()
724 /// }
725 /// #
726 /// # serde::__serialize_unimplemented! {
727 /// # bool i8 i16 i32 i64 u8 u16 u32 u64 f32 f64 char str none some
728 /// # unit unit_struct unit_variant newtype_struct newtype_variant
729 /// # seq tuple tuple_struct tuple_variant map struct struct_variant
730 /// # }
731 /// # }
732 /// ```
serialize_bytes(self, v: &[u8]) -> Result<Self::Ok, Self::Error>733 fn serialize_bytes(self, v: &[u8]) -> Result<Self::Ok, Self::Error>;
734
735 /// Serialize a [`None`] value.
736 ///
737 /// ```edition2021
738 /// # use serde::{Serialize, Serializer};
739 /// #
740 /// # enum Option<T> {
741 /// # Some(T),
742 /// # None,
743 /// # }
744 /// #
745 /// # use self::Option::{Some, None};
746 /// #
747 /// impl<T> Serialize for Option<T>
748 /// where
749 /// T: Serialize,
750 /// {
751 /// fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
752 /// where
753 /// S: Serializer,
754 /// {
755 /// match *self {
756 /// Some(ref value) => serializer.serialize_some(value),
757 /// None => serializer.serialize_none(),
758 /// }
759 /// }
760 /// }
761 /// #
762 /// # fn main() {}
763 /// ```
764 ///
765 /// [`None`]: https://doc.rust-lang.org/std/option/enum.Option.html#variant.None
serialize_none(self) -> Result<Self::Ok, Self::Error>766 fn serialize_none(self) -> Result<Self::Ok, Self::Error>;
767
768 /// Serialize a [`Some(T)`] value.
769 ///
770 /// ```edition2021
771 /// # use serde::{Serialize, Serializer};
772 /// #
773 /// # enum Option<T> {
774 /// # Some(T),
775 /// # None,
776 /// # }
777 /// #
778 /// # use self::Option::{Some, None};
779 /// #
780 /// impl<T> Serialize for Option<T>
781 /// where
782 /// T: Serialize,
783 /// {
784 /// fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
785 /// where
786 /// S: Serializer,
787 /// {
788 /// match *self {
789 /// Some(ref value) => serializer.serialize_some(value),
790 /// None => serializer.serialize_none(),
791 /// }
792 /// }
793 /// }
794 /// #
795 /// # fn main() {}
796 /// ```
797 ///
798 /// [`Some(T)`]: https://doc.rust-lang.org/std/option/enum.Option.html#variant.Some
serialize_some<T: ?Sized>(self, value: &T) -> Result<Self::Ok, Self::Error> where T: Serialize799 fn serialize_some<T: ?Sized>(self, value: &T) -> Result<Self::Ok, Self::Error>
800 where
801 T: Serialize;
802
803 /// Serialize a `()` value.
804 ///
805 /// ```edition2021
806 /// # use serde::Serializer;
807 /// #
808 /// # serde::__private_serialize!();
809 /// #
810 /// impl Serialize for () {
811 /// fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
812 /// where
813 /// S: Serializer,
814 /// {
815 /// serializer.serialize_unit()
816 /// }
817 /// }
818 /// ```
serialize_unit(self) -> Result<Self::Ok, Self::Error>819 fn serialize_unit(self) -> Result<Self::Ok, Self::Error>;
820
821 /// Serialize a unit struct like `struct Unit` or `PhantomData<T>`.
822 ///
823 /// A reasonable implementation would be to forward to `serialize_unit`.
824 ///
825 /// ```edition2021
826 /// use serde::{Serialize, Serializer};
827 ///
828 /// struct Nothing;
829 ///
830 /// impl Serialize for Nothing {
831 /// fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
832 /// where
833 /// S: Serializer,
834 /// {
835 /// serializer.serialize_unit_struct("Nothing")
836 /// }
837 /// }
838 /// ```
serialize_unit_struct(self, name: &'static str) -> Result<Self::Ok, Self::Error>839 fn serialize_unit_struct(self, name: &'static str) -> Result<Self::Ok, Self::Error>;
840
841 /// Serialize a unit variant like `E::A` in `enum E { A, B }`.
842 ///
843 /// The `name` is the name of the enum, the `variant_index` is the index of
844 /// this variant within the enum, and the `variant` is the name of the
845 /// variant.
846 ///
847 /// ```edition2021
848 /// use serde::{Serialize, Serializer};
849 ///
850 /// enum E {
851 /// A,
852 /// B,
853 /// }
854 ///
855 /// impl Serialize for E {
856 /// fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
857 /// where
858 /// S: Serializer,
859 /// {
860 /// match *self {
861 /// E::A => serializer.serialize_unit_variant("E", 0, "A"),
862 /// E::B => serializer.serialize_unit_variant("E", 1, "B"),
863 /// }
864 /// }
865 /// }
866 /// ```
serialize_unit_variant( self, name: &'static str, variant_index: u32, variant: &'static str, ) -> Result<Self::Ok, Self::Error>867 fn serialize_unit_variant(
868 self,
869 name: &'static str,
870 variant_index: u32,
871 variant: &'static str,
872 ) -> Result<Self::Ok, Self::Error>;
873
874 /// Serialize a newtype struct like `struct Millimeters(u8)`.
875 ///
876 /// Serializers are encouraged to treat newtype structs as insignificant
877 /// wrappers around the data they contain. A reasonable implementation would
878 /// be to forward to `value.serialize(self)`.
879 ///
880 /// ```edition2021
881 /// use serde::{Serialize, Serializer};
882 ///
883 /// struct Millimeters(u8);
884 ///
885 /// impl Serialize for Millimeters {
886 /// fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
887 /// where
888 /// S: Serializer,
889 /// {
890 /// serializer.serialize_newtype_struct("Millimeters", &self.0)
891 /// }
892 /// }
893 /// ```
serialize_newtype_struct<T: ?Sized>( self, name: &'static str, value: &T, ) -> Result<Self::Ok, Self::Error> where T: Serialize894 fn serialize_newtype_struct<T: ?Sized>(
895 self,
896 name: &'static str,
897 value: &T,
898 ) -> Result<Self::Ok, Self::Error>
899 where
900 T: Serialize;
901
902 /// Serialize a newtype variant like `E::N` in `enum E { N(u8) }`.
903 ///
904 /// The `name` is the name of the enum, the `variant_index` is the index of
905 /// this variant within the enum, and the `variant` is the name of the
906 /// variant. The `value` is the data contained within this newtype variant.
907 ///
908 /// ```edition2021
909 /// use serde::{Serialize, Serializer};
910 ///
911 /// enum E {
912 /// M(String),
913 /// N(u8),
914 /// }
915 ///
916 /// impl Serialize for E {
917 /// fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
918 /// where
919 /// S: Serializer,
920 /// {
921 /// match *self {
922 /// E::M(ref s) => serializer.serialize_newtype_variant("E", 0, "M", s),
923 /// E::N(n) => serializer.serialize_newtype_variant("E", 1, "N", &n),
924 /// }
925 /// }
926 /// }
927 /// ```
serialize_newtype_variant<T: ?Sized>( self, name: &'static str, variant_index: u32, variant: &'static str, value: &T, ) -> Result<Self::Ok, Self::Error> where T: Serialize928 fn serialize_newtype_variant<T: ?Sized>(
929 self,
930 name: &'static str,
931 variant_index: u32,
932 variant: &'static str,
933 value: &T,
934 ) -> Result<Self::Ok, Self::Error>
935 where
936 T: Serialize;
937
938 /// Begin to serialize a variably sized sequence. This call must be
939 /// followed by zero or more calls to `serialize_element`, then a call to
940 /// `end`.
941 ///
942 /// The argument is the number of elements in the sequence, which may or may
943 /// not be computable before the sequence is iterated. Some serializers only
944 /// support sequences whose length is known up front.
945 ///
946 /// ```edition2021
947 /// # use std::marker::PhantomData;
948 /// #
949 /// # struct Vec<T>(PhantomData<T>);
950 /// #
951 /// # impl<T> Vec<T> {
952 /// # fn len(&self) -> usize {
953 /// # unimplemented!()
954 /// # }
955 /// # }
956 /// #
957 /// # impl<'a, T> IntoIterator for &'a Vec<T> {
958 /// # type Item = &'a T;
959 /// # type IntoIter = Box<dyn Iterator<Item = &'a T>>;
960 /// #
961 /// # fn into_iter(self) -> Self::IntoIter {
962 /// # unimplemented!()
963 /// # }
964 /// # }
965 /// #
966 /// use serde::ser::{Serialize, SerializeSeq, Serializer};
967 ///
968 /// impl<T> Serialize for Vec<T>
969 /// where
970 /// T: Serialize,
971 /// {
972 /// fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
973 /// where
974 /// S: Serializer,
975 /// {
976 /// let mut seq = serializer.serialize_seq(Some(self.len()))?;
977 /// for element in self {
978 /// seq.serialize_element(element)?;
979 /// }
980 /// seq.end()
981 /// }
982 /// }
983 /// ```
serialize_seq(self, len: Option<usize>) -> Result<Self::SerializeSeq, Self::Error>984 fn serialize_seq(self, len: Option<usize>) -> Result<Self::SerializeSeq, Self::Error>;
985
986 /// Begin to serialize a statically sized sequence whose length will be
987 /// known at deserialization time without looking at the serialized data.
988 /// This call must be followed by zero or more calls to `serialize_element`,
989 /// then a call to `end`.
990 ///
991 /// ```edition2021
992 /// use serde::ser::{Serialize, SerializeTuple, Serializer};
993 ///
994 /// # mod fool {
995 /// # trait Serialize {}
996 /// impl<A, B, C> Serialize for (A, B, C)
997 /// # {}
998 /// # }
999 /// #
1000 /// # struct Tuple3<A, B, C>(A, B, C);
1001 /// #
1002 /// # impl<A, B, C> Serialize for Tuple3<A, B, C>
1003 /// where
1004 /// A: Serialize,
1005 /// B: Serialize,
1006 /// C: Serialize,
1007 /// {
1008 /// fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
1009 /// where
1010 /// S: Serializer,
1011 /// {
1012 /// let mut tup = serializer.serialize_tuple(3)?;
1013 /// tup.serialize_element(&self.0)?;
1014 /// tup.serialize_element(&self.1)?;
1015 /// tup.serialize_element(&self.2)?;
1016 /// tup.end()
1017 /// }
1018 /// }
1019 /// ```
1020 ///
1021 /// ```edition2021
1022 /// use serde::ser::{Serialize, SerializeTuple, Serializer};
1023 ///
1024 /// const VRAM_SIZE: usize = 386;
1025 /// struct Vram([u16; VRAM_SIZE]);
1026 ///
1027 /// impl Serialize for Vram {
1028 /// fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
1029 /// where
1030 /// S: Serializer,
1031 /// {
1032 /// let mut seq = serializer.serialize_tuple(VRAM_SIZE)?;
1033 /// for element in &self.0[..] {
1034 /// seq.serialize_element(element)?;
1035 /// }
1036 /// seq.end()
1037 /// }
1038 /// }
1039 /// ```
serialize_tuple(self, len: usize) -> Result<Self::SerializeTuple, Self::Error>1040 fn serialize_tuple(self, len: usize) -> Result<Self::SerializeTuple, Self::Error>;
1041
1042 /// Begin to serialize a tuple struct like `struct Rgb(u8, u8, u8)`. This
1043 /// call must be followed by zero or more calls to `serialize_field`, then a
1044 /// call to `end`.
1045 ///
1046 /// The `name` is the name of the tuple struct and the `len` is the number
1047 /// of data fields that will be serialized.
1048 ///
1049 /// ```edition2021
1050 /// use serde::ser::{Serialize, SerializeTupleStruct, Serializer};
1051 ///
1052 /// struct Rgb(u8, u8, u8);
1053 ///
1054 /// impl Serialize for Rgb {
1055 /// fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
1056 /// where
1057 /// S: Serializer,
1058 /// {
1059 /// let mut ts = serializer.serialize_tuple_struct("Rgb", 3)?;
1060 /// ts.serialize_field(&self.0)?;
1061 /// ts.serialize_field(&self.1)?;
1062 /// ts.serialize_field(&self.2)?;
1063 /// ts.end()
1064 /// }
1065 /// }
1066 /// ```
serialize_tuple_struct( self, name: &'static str, len: usize, ) -> Result<Self::SerializeTupleStruct, Self::Error>1067 fn serialize_tuple_struct(
1068 self,
1069 name: &'static str,
1070 len: usize,
1071 ) -> Result<Self::SerializeTupleStruct, Self::Error>;
1072
1073 /// Begin to serialize a tuple variant like `E::T` in `enum E { T(u8, u8)
1074 /// }`. This call must be followed by zero or more calls to
1075 /// `serialize_field`, then a call to `end`.
1076 ///
1077 /// The `name` is the name of the enum, the `variant_index` is the index of
1078 /// this variant within the enum, the `variant` is the name of the variant,
1079 /// and the `len` is the number of data fields that will be serialized.
1080 ///
1081 /// ```edition2021
1082 /// use serde::ser::{Serialize, SerializeTupleVariant, Serializer};
1083 ///
1084 /// enum E {
1085 /// T(u8, u8),
1086 /// U(String, u32, u32),
1087 /// }
1088 ///
1089 /// impl Serialize for E {
1090 /// fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
1091 /// where
1092 /// S: Serializer,
1093 /// {
1094 /// match *self {
1095 /// E::T(ref a, ref b) => {
1096 /// let mut tv = serializer.serialize_tuple_variant("E", 0, "T", 2)?;
1097 /// tv.serialize_field(a)?;
1098 /// tv.serialize_field(b)?;
1099 /// tv.end()
1100 /// }
1101 /// E::U(ref a, ref b, ref c) => {
1102 /// let mut tv = serializer.serialize_tuple_variant("E", 1, "U", 3)?;
1103 /// tv.serialize_field(a)?;
1104 /// tv.serialize_field(b)?;
1105 /// tv.serialize_field(c)?;
1106 /// tv.end()
1107 /// }
1108 /// }
1109 /// }
1110 /// }
1111 /// ```
serialize_tuple_variant( self, name: &'static str, variant_index: u32, variant: &'static str, len: usize, ) -> Result<Self::SerializeTupleVariant, Self::Error>1112 fn serialize_tuple_variant(
1113 self,
1114 name: &'static str,
1115 variant_index: u32,
1116 variant: &'static str,
1117 len: usize,
1118 ) -> Result<Self::SerializeTupleVariant, Self::Error>;
1119
1120 /// Begin to serialize a map. This call must be followed by zero or more
1121 /// calls to `serialize_key` and `serialize_value`, then a call to `end`.
1122 ///
1123 /// The argument is the number of elements in the map, which may or may not
1124 /// be computable before the map is iterated. Some serializers only support
1125 /// maps whose length is known up front.
1126 ///
1127 /// ```edition2021
1128 /// # use std::marker::PhantomData;
1129 /// #
1130 /// # struct HashMap<K, V>(PhantomData<K>, PhantomData<V>);
1131 /// #
1132 /// # impl<K, V> HashMap<K, V> {
1133 /// # fn len(&self) -> usize {
1134 /// # unimplemented!()
1135 /// # }
1136 /// # }
1137 /// #
1138 /// # impl<'a, K, V> IntoIterator for &'a HashMap<K, V> {
1139 /// # type Item = (&'a K, &'a V);
1140 /// # type IntoIter = Box<dyn Iterator<Item = (&'a K, &'a V)>>;
1141 /// #
1142 /// # fn into_iter(self) -> Self::IntoIter {
1143 /// # unimplemented!()
1144 /// # }
1145 /// # }
1146 /// #
1147 /// use serde::ser::{Serialize, SerializeMap, Serializer};
1148 ///
1149 /// impl<K, V> Serialize for HashMap<K, V>
1150 /// where
1151 /// K: Serialize,
1152 /// V: Serialize,
1153 /// {
1154 /// fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
1155 /// where
1156 /// S: Serializer,
1157 /// {
1158 /// let mut map = serializer.serialize_map(Some(self.len()))?;
1159 /// for (k, v) in self {
1160 /// map.serialize_entry(k, v)?;
1161 /// }
1162 /// map.end()
1163 /// }
1164 /// }
1165 /// ```
serialize_map(self, len: Option<usize>) -> Result<Self::SerializeMap, Self::Error>1166 fn serialize_map(self, len: Option<usize>) -> Result<Self::SerializeMap, Self::Error>;
1167
1168 /// Begin to serialize a struct like `struct Rgb { r: u8, g: u8, b: u8 }`.
1169 /// This call must be followed by zero or more calls to `serialize_field`,
1170 /// then a call to `end`.
1171 ///
1172 /// The `name` is the name of the struct and the `len` is the number of
1173 /// data fields that will be serialized.
1174 ///
1175 /// ```edition2021
1176 /// use serde::ser::{Serialize, SerializeStruct, Serializer};
1177 ///
1178 /// struct Rgb {
1179 /// r: u8,
1180 /// g: u8,
1181 /// b: u8,
1182 /// }
1183 ///
1184 /// impl Serialize for Rgb {
1185 /// fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
1186 /// where
1187 /// S: Serializer,
1188 /// {
1189 /// let mut rgb = serializer.serialize_struct("Rgb", 3)?;
1190 /// rgb.serialize_field("r", &self.r)?;
1191 /// rgb.serialize_field("g", &self.g)?;
1192 /// rgb.serialize_field("b", &self.b)?;
1193 /// rgb.end()
1194 /// }
1195 /// }
1196 /// ```
serialize_struct( self, name: &'static str, len: usize, ) -> Result<Self::SerializeStruct, Self::Error>1197 fn serialize_struct(
1198 self,
1199 name: &'static str,
1200 len: usize,
1201 ) -> Result<Self::SerializeStruct, Self::Error>;
1202
1203 /// Begin to serialize a struct variant like `E::S` in `enum E { S { r: u8,
1204 /// g: u8, b: u8 } }`. This call must be followed by zero or more calls to
1205 /// `serialize_field`, then a call to `end`.
1206 ///
1207 /// The `name` is the name of the enum, the `variant_index` is the index of
1208 /// this variant within the enum, the `variant` is the name of the variant,
1209 /// and the `len` is the number of data fields that will be serialized.
1210 ///
1211 /// ```edition2021
1212 /// use serde::ser::{Serialize, SerializeStructVariant, Serializer};
1213 ///
1214 /// enum E {
1215 /// S { r: u8, g: u8, b: u8 },
1216 /// }
1217 ///
1218 /// impl Serialize for E {
1219 /// fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
1220 /// where
1221 /// S: Serializer,
1222 /// {
1223 /// match *self {
1224 /// E::S {
1225 /// ref r,
1226 /// ref g,
1227 /// ref b,
1228 /// } => {
1229 /// let mut sv = serializer.serialize_struct_variant("E", 0, "S", 3)?;
1230 /// sv.serialize_field("r", r)?;
1231 /// sv.serialize_field("g", g)?;
1232 /// sv.serialize_field("b", b)?;
1233 /// sv.end()
1234 /// }
1235 /// }
1236 /// }
1237 /// }
1238 /// ```
serialize_struct_variant( self, name: &'static str, variant_index: u32, variant: &'static str, len: usize, ) -> Result<Self::SerializeStructVariant, Self::Error>1239 fn serialize_struct_variant(
1240 self,
1241 name: &'static str,
1242 variant_index: u32,
1243 variant: &'static str,
1244 len: usize,
1245 ) -> Result<Self::SerializeStructVariant, Self::Error>;
1246
1247 /// Collect an iterator as a sequence.
1248 ///
1249 /// The default implementation serializes each item yielded by the iterator
1250 /// using [`serialize_seq`]. Implementors should not need to override this
1251 /// method.
1252 ///
1253 /// ```edition2021
1254 /// use serde::{Serialize, Serializer};
1255 ///
1256 /// struct SecretlyOneHigher {
1257 /// data: Vec<i32>,
1258 /// }
1259 ///
1260 /// impl Serialize for SecretlyOneHigher {
1261 /// fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
1262 /// where
1263 /// S: Serializer,
1264 /// {
1265 /// serializer.collect_seq(self.data.iter().map(|x| x + 1))
1266 /// }
1267 /// }
1268 /// ```
1269 ///
1270 /// [`serialize_seq`]: #tymethod.serialize_seq
collect_seq<I>(self, iter: I) -> Result<Self::Ok, Self::Error> where I: IntoIterator, <I as IntoIterator>::Item: Serialize,1271 fn collect_seq<I>(self, iter: I) -> Result<Self::Ok, Self::Error>
1272 where
1273 I: IntoIterator,
1274 <I as IntoIterator>::Item: Serialize,
1275 {
1276 let mut iter = iter.into_iter();
1277 let mut serializer = tri!(self.serialize_seq(iterator_len_hint(&iter)));
1278 tri!(iter.try_for_each(|item| serializer.serialize_element(&item)));
1279 serializer.end()
1280 }
1281
1282 /// Collect an iterator as a map.
1283 ///
1284 /// The default implementation serializes each pair yielded by the iterator
1285 /// using [`serialize_map`]. Implementors should not need to override this
1286 /// method.
1287 ///
1288 /// ```edition2021
1289 /// use serde::{Serialize, Serializer};
1290 /// use std::collections::BTreeSet;
1291 ///
1292 /// struct MapToUnit {
1293 /// keys: BTreeSet<i32>,
1294 /// }
1295 ///
1296 /// // Serializes as a map in which the values are all unit.
1297 /// impl Serialize for MapToUnit {
1298 /// fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
1299 /// where
1300 /// S: Serializer,
1301 /// {
1302 /// serializer.collect_map(self.keys.iter().map(|k| (k, ())))
1303 /// }
1304 /// }
1305 /// ```
1306 ///
1307 /// [`serialize_map`]: #tymethod.serialize_map
collect_map<K, V, I>(self, iter: I) -> Result<Self::Ok, Self::Error> where K: Serialize, V: Serialize, I: IntoIterator<Item = (K, V)>,1308 fn collect_map<K, V, I>(self, iter: I) -> Result<Self::Ok, Self::Error>
1309 where
1310 K: Serialize,
1311 V: Serialize,
1312 I: IntoIterator<Item = (K, V)>,
1313 {
1314 let mut iter = iter.into_iter();
1315 let mut serializer = tri!(self.serialize_map(iterator_len_hint(&iter)));
1316 tri!(iter.try_for_each(|(key, value)| serializer.serialize_entry(&key, &value)));
1317 serializer.end()
1318 }
1319
1320 /// Serialize a string produced by an implementation of `Display`.
1321 ///
1322 /// The default implementation builds a heap-allocated [`String`] and
1323 /// delegates to [`serialize_str`]. Serializers are encouraged to provide a
1324 /// more efficient implementation if possible.
1325 ///
1326 /// ```edition2021
1327 /// # struct DateTime;
1328 /// #
1329 /// # impl DateTime {
1330 /// # fn naive_local(&self) -> () { () }
1331 /// # fn offset(&self) -> () { () }
1332 /// # }
1333 /// #
1334 /// use serde::{Serialize, Serializer};
1335 ///
1336 /// impl Serialize for DateTime {
1337 /// fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
1338 /// where
1339 /// S: Serializer,
1340 /// {
1341 /// serializer.collect_str(&format_args!("{:?}{:?}", self.naive_local(), self.offset()))
1342 /// }
1343 /// }
1344 /// ```
1345 ///
1346 /// [`String`]: https://doc.rust-lang.org/std/string/struct.String.html
1347 /// [`serialize_str`]: #tymethod.serialize_str
1348 #[cfg(any(feature = "std", feature = "alloc"))]
collect_str<T: ?Sized>(self, value: &T) -> Result<Self::Ok, Self::Error> where T: Display,1349 fn collect_str<T: ?Sized>(self, value: &T) -> Result<Self::Ok, Self::Error>
1350 where
1351 T: Display,
1352 {
1353 self.serialize_str(&value.to_string())
1354 }
1355
1356 /// Serialize a string produced by an implementation of `Display`.
1357 ///
1358 /// Serializers that use `no_std` are required to provide an implementation
1359 /// of this method. If no more sensible behavior is possible, the
1360 /// implementation is expected to return an error.
1361 ///
1362 /// ```edition2021
1363 /// # struct DateTime;
1364 /// #
1365 /// # impl DateTime {
1366 /// # fn naive_local(&self) -> () { () }
1367 /// # fn offset(&self) -> () { () }
1368 /// # }
1369 /// #
1370 /// use serde::{Serialize, Serializer};
1371 ///
1372 /// impl Serialize for DateTime {
1373 /// fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
1374 /// where
1375 /// S: Serializer,
1376 /// {
1377 /// serializer.collect_str(&format_args!("{:?}{:?}", self.naive_local(), self.offset()))
1378 /// }
1379 /// }
1380 /// ```
1381 #[cfg(not(any(feature = "std", feature = "alloc")))]
collect_str<T: ?Sized>(self, value: &T) -> Result<Self::Ok, Self::Error> where T: Display1382 fn collect_str<T: ?Sized>(self, value: &T) -> Result<Self::Ok, Self::Error>
1383 where
1384 T: Display;
1385
1386 /// Determine whether `Serialize` implementations should serialize in
1387 /// human-readable form.
1388 ///
1389 /// Some types have a human-readable form that may be somewhat expensive to
1390 /// construct, as well as a binary form that is compact and efficient.
1391 /// Generally text-based formats like JSON and YAML will prefer to use the
1392 /// human-readable one and binary formats like Postcard will prefer the
1393 /// compact one.
1394 ///
1395 /// ```edition2021
1396 /// # use std::fmt::{self, Display};
1397 /// #
1398 /// # struct Timestamp;
1399 /// #
1400 /// # impl Timestamp {
1401 /// # fn seconds_since_epoch(&self) -> u64 { unimplemented!() }
1402 /// # }
1403 /// #
1404 /// # impl Display for Timestamp {
1405 /// # fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
1406 /// # unimplemented!()
1407 /// # }
1408 /// # }
1409 /// #
1410 /// use serde::{Serialize, Serializer};
1411 ///
1412 /// impl Serialize for Timestamp {
1413 /// fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
1414 /// where
1415 /// S: Serializer,
1416 /// {
1417 /// if serializer.is_human_readable() {
1418 /// // Serialize to a human-readable string "2015-05-15T17:01:00Z".
1419 /// self.to_string().serialize(serializer)
1420 /// } else {
1421 /// // Serialize to a compact binary representation.
1422 /// self.seconds_since_epoch().serialize(serializer)
1423 /// }
1424 /// }
1425 /// }
1426 /// ```
1427 ///
1428 /// The default implementation of this method returns `true`. Data formats
1429 /// may override this to `false` to request a compact form for types that
1430 /// support one. Note that modifying this method to change a format from
1431 /// human-readable to compact or vice versa should be regarded as a breaking
1432 /// change, as a value serialized in human-readable mode is not required to
1433 /// deserialize from the same data in compact mode.
1434 #[inline]
is_human_readable(&self) -> bool1435 fn is_human_readable(&self) -> bool {
1436 true
1437 }
1438 }
1439
1440 /// Returned from `Serializer::serialize_seq`.
1441 ///
1442 /// # Example use
1443 ///
1444 /// ```edition2021
1445 /// # use std::marker::PhantomData;
1446 /// #
1447 /// # struct Vec<T>(PhantomData<T>);
1448 /// #
1449 /// # impl<T> Vec<T> {
1450 /// # fn len(&self) -> usize {
1451 /// # unimplemented!()
1452 /// # }
1453 /// # }
1454 /// #
1455 /// # impl<'a, T> IntoIterator for &'a Vec<T> {
1456 /// # type Item = &'a T;
1457 /// # type IntoIter = Box<dyn Iterator<Item = &'a T>>;
1458 /// # fn into_iter(self) -> Self::IntoIter {
1459 /// # unimplemented!()
1460 /// # }
1461 /// # }
1462 /// #
1463 /// use serde::ser::{Serialize, SerializeSeq, Serializer};
1464 ///
1465 /// impl<T> Serialize for Vec<T>
1466 /// where
1467 /// T: Serialize,
1468 /// {
1469 /// fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
1470 /// where
1471 /// S: Serializer,
1472 /// {
1473 /// let mut seq = serializer.serialize_seq(Some(self.len()))?;
1474 /// for element in self {
1475 /// seq.serialize_element(element)?;
1476 /// }
1477 /// seq.end()
1478 /// }
1479 /// }
1480 /// ```
1481 ///
1482 /// # Example implementation
1483 ///
1484 /// The [example data format] presented on the website demonstrates an
1485 /// implementation of `SerializeSeq` for a basic JSON data format.
1486 ///
1487 /// [example data format]: https://serde.rs/data-format.html
1488 pub trait SerializeSeq {
1489 /// Must match the `Ok` type of our `Serializer`.
1490 type Ok;
1491
1492 /// Must match the `Error` type of our `Serializer`.
1493 type Error: Error;
1494
1495 /// Serialize a sequence element.
serialize_element<T: ?Sized>(&mut self, value: &T) -> Result<(), Self::Error> where T: Serialize1496 fn serialize_element<T: ?Sized>(&mut self, value: &T) -> Result<(), Self::Error>
1497 where
1498 T: Serialize;
1499
1500 /// Finish serializing a sequence.
end(self) -> Result<Self::Ok, Self::Error>1501 fn end(self) -> Result<Self::Ok, Self::Error>;
1502 }
1503
1504 /// Returned from `Serializer::serialize_tuple`.
1505 ///
1506 /// # Example use
1507 ///
1508 /// ```edition2021
1509 /// use serde::ser::{Serialize, SerializeTuple, Serializer};
1510 ///
1511 /// # mod fool {
1512 /// # trait Serialize {}
1513 /// impl<A, B, C> Serialize for (A, B, C)
1514 /// # {}
1515 /// # }
1516 /// #
1517 /// # struct Tuple3<A, B, C>(A, B, C);
1518 /// #
1519 /// # impl<A, B, C> Serialize for Tuple3<A, B, C>
1520 /// where
1521 /// A: Serialize,
1522 /// B: Serialize,
1523 /// C: Serialize,
1524 /// {
1525 /// fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
1526 /// where
1527 /// S: Serializer,
1528 /// {
1529 /// let mut tup = serializer.serialize_tuple(3)?;
1530 /// tup.serialize_element(&self.0)?;
1531 /// tup.serialize_element(&self.1)?;
1532 /// tup.serialize_element(&self.2)?;
1533 /// tup.end()
1534 /// }
1535 /// }
1536 /// ```
1537 ///
1538 /// ```edition2021
1539 /// # use std::marker::PhantomData;
1540 /// #
1541 /// # struct Array<T>(PhantomData<T>);
1542 /// #
1543 /// # impl<T> Array<T> {
1544 /// # fn len(&self) -> usize {
1545 /// # unimplemented!()
1546 /// # }
1547 /// # }
1548 /// #
1549 /// # impl<'a, T> IntoIterator for &'a Array<T> {
1550 /// # type Item = &'a T;
1551 /// # type IntoIter = Box<dyn Iterator<Item = &'a T>>;
1552 /// # fn into_iter(self) -> Self::IntoIter {
1553 /// # unimplemented!()
1554 /// # }
1555 /// # }
1556 /// #
1557 /// use serde::ser::{Serialize, SerializeTuple, Serializer};
1558 ///
1559 /// # mod fool {
1560 /// # trait Serialize {}
1561 /// impl<T> Serialize for [T; 16]
1562 /// # {}
1563 /// # }
1564 /// #
1565 /// # impl<T> Serialize for Array<T>
1566 /// where
1567 /// T: Serialize,
1568 /// {
1569 /// fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
1570 /// where
1571 /// S: Serializer,
1572 /// {
1573 /// let mut seq = serializer.serialize_tuple(16)?;
1574 /// for element in self {
1575 /// seq.serialize_element(element)?;
1576 /// }
1577 /// seq.end()
1578 /// }
1579 /// }
1580 /// ```
1581 ///
1582 /// # Example implementation
1583 ///
1584 /// The [example data format] presented on the website demonstrates an
1585 /// implementation of `SerializeTuple` for a basic JSON data format.
1586 ///
1587 /// [example data format]: https://serde.rs/data-format.html
1588 pub trait SerializeTuple {
1589 /// Must match the `Ok` type of our `Serializer`.
1590 type Ok;
1591
1592 /// Must match the `Error` type of our `Serializer`.
1593 type Error: Error;
1594
1595 /// Serialize a tuple element.
serialize_element<T: ?Sized>(&mut self, value: &T) -> Result<(), Self::Error> where T: Serialize1596 fn serialize_element<T: ?Sized>(&mut self, value: &T) -> Result<(), Self::Error>
1597 where
1598 T: Serialize;
1599
1600 /// Finish serializing a tuple.
end(self) -> Result<Self::Ok, Self::Error>1601 fn end(self) -> Result<Self::Ok, Self::Error>;
1602 }
1603
1604 /// Returned from `Serializer::serialize_tuple_struct`.
1605 ///
1606 /// # Example use
1607 ///
1608 /// ```edition2021
1609 /// use serde::ser::{Serialize, SerializeTupleStruct, Serializer};
1610 ///
1611 /// struct Rgb(u8, u8, u8);
1612 ///
1613 /// impl Serialize for Rgb {
1614 /// fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
1615 /// where
1616 /// S: Serializer,
1617 /// {
1618 /// let mut ts = serializer.serialize_tuple_struct("Rgb", 3)?;
1619 /// ts.serialize_field(&self.0)?;
1620 /// ts.serialize_field(&self.1)?;
1621 /// ts.serialize_field(&self.2)?;
1622 /// ts.end()
1623 /// }
1624 /// }
1625 /// ```
1626 ///
1627 /// # Example implementation
1628 ///
1629 /// The [example data format] presented on the website demonstrates an
1630 /// implementation of `SerializeTupleStruct` for a basic JSON data format.
1631 ///
1632 /// [example data format]: https://serde.rs/data-format.html
1633 pub trait SerializeTupleStruct {
1634 /// Must match the `Ok` type of our `Serializer`.
1635 type Ok;
1636
1637 /// Must match the `Error` type of our `Serializer`.
1638 type Error: Error;
1639
1640 /// Serialize a tuple struct field.
serialize_field<T: ?Sized>(&mut self, value: &T) -> Result<(), Self::Error> where T: Serialize1641 fn serialize_field<T: ?Sized>(&mut self, value: &T) -> Result<(), Self::Error>
1642 where
1643 T: Serialize;
1644
1645 /// Finish serializing a tuple struct.
end(self) -> Result<Self::Ok, Self::Error>1646 fn end(self) -> Result<Self::Ok, Self::Error>;
1647 }
1648
1649 /// Returned from `Serializer::serialize_tuple_variant`.
1650 ///
1651 /// # Example use
1652 ///
1653 /// ```edition2021
1654 /// use serde::ser::{Serialize, SerializeTupleVariant, Serializer};
1655 ///
1656 /// enum E {
1657 /// T(u8, u8),
1658 /// U(String, u32, u32),
1659 /// }
1660 ///
1661 /// impl Serialize for E {
1662 /// fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
1663 /// where
1664 /// S: Serializer,
1665 /// {
1666 /// match *self {
1667 /// E::T(ref a, ref b) => {
1668 /// let mut tv = serializer.serialize_tuple_variant("E", 0, "T", 2)?;
1669 /// tv.serialize_field(a)?;
1670 /// tv.serialize_field(b)?;
1671 /// tv.end()
1672 /// }
1673 /// E::U(ref a, ref b, ref c) => {
1674 /// let mut tv = serializer.serialize_tuple_variant("E", 1, "U", 3)?;
1675 /// tv.serialize_field(a)?;
1676 /// tv.serialize_field(b)?;
1677 /// tv.serialize_field(c)?;
1678 /// tv.end()
1679 /// }
1680 /// }
1681 /// }
1682 /// }
1683 /// ```
1684 ///
1685 /// # Example implementation
1686 ///
1687 /// The [example data format] presented on the website demonstrates an
1688 /// implementation of `SerializeTupleVariant` for a basic JSON data format.
1689 ///
1690 /// [example data format]: https://serde.rs/data-format.html
1691 pub trait SerializeTupleVariant {
1692 /// Must match the `Ok` type of our `Serializer`.
1693 type Ok;
1694
1695 /// Must match the `Error` type of our `Serializer`.
1696 type Error: Error;
1697
1698 /// Serialize a tuple variant field.
serialize_field<T: ?Sized>(&mut self, value: &T) -> Result<(), Self::Error> where T: Serialize1699 fn serialize_field<T: ?Sized>(&mut self, value: &T) -> Result<(), Self::Error>
1700 where
1701 T: Serialize;
1702
1703 /// Finish serializing a tuple variant.
end(self) -> Result<Self::Ok, Self::Error>1704 fn end(self) -> Result<Self::Ok, Self::Error>;
1705 }
1706
1707 /// Returned from `Serializer::serialize_map`.
1708 ///
1709 /// # Example use
1710 ///
1711 /// ```edition2021
1712 /// # use std::marker::PhantomData;
1713 /// #
1714 /// # struct HashMap<K, V>(PhantomData<K>, PhantomData<V>);
1715 /// #
1716 /// # impl<K, V> HashMap<K, V> {
1717 /// # fn len(&self) -> usize {
1718 /// # unimplemented!()
1719 /// # }
1720 /// # }
1721 /// #
1722 /// # impl<'a, K, V> IntoIterator for &'a HashMap<K, V> {
1723 /// # type Item = (&'a K, &'a V);
1724 /// # type IntoIter = Box<dyn Iterator<Item = (&'a K, &'a V)>>;
1725 /// #
1726 /// # fn into_iter(self) -> Self::IntoIter {
1727 /// # unimplemented!()
1728 /// # }
1729 /// # }
1730 /// #
1731 /// use serde::ser::{Serialize, SerializeMap, Serializer};
1732 ///
1733 /// impl<K, V> Serialize for HashMap<K, V>
1734 /// where
1735 /// K: Serialize,
1736 /// V: Serialize,
1737 /// {
1738 /// fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
1739 /// where
1740 /// S: Serializer,
1741 /// {
1742 /// let mut map = serializer.serialize_map(Some(self.len()))?;
1743 /// for (k, v) in self {
1744 /// map.serialize_entry(k, v)?;
1745 /// }
1746 /// map.end()
1747 /// }
1748 /// }
1749 /// ```
1750 ///
1751 /// # Example implementation
1752 ///
1753 /// The [example data format] presented on the website demonstrates an
1754 /// implementation of `SerializeMap` for a basic JSON data format.
1755 ///
1756 /// [example data format]: https://serde.rs/data-format.html
1757 pub trait SerializeMap {
1758 /// Must match the `Ok` type of our `Serializer`.
1759 type Ok;
1760
1761 /// Must match the `Error` type of our `Serializer`.
1762 type Error: Error;
1763
1764 /// Serialize a map key.
1765 ///
1766 /// If possible, `Serialize` implementations are encouraged to use
1767 /// `serialize_entry` instead as it may be implemented more efficiently in
1768 /// some formats compared to a pair of calls to `serialize_key` and
1769 /// `serialize_value`.
serialize_key<T: ?Sized>(&mut self, key: &T) -> Result<(), Self::Error> where T: Serialize1770 fn serialize_key<T: ?Sized>(&mut self, key: &T) -> Result<(), Self::Error>
1771 where
1772 T: Serialize;
1773
1774 /// Serialize a map value.
1775 ///
1776 /// # Panics
1777 ///
1778 /// Calling `serialize_value` before `serialize_key` is incorrect and is
1779 /// allowed to panic or produce bogus results.
serialize_value<T: ?Sized>(&mut self, value: &T) -> Result<(), Self::Error> where T: Serialize1780 fn serialize_value<T: ?Sized>(&mut self, value: &T) -> Result<(), Self::Error>
1781 where
1782 T: Serialize;
1783
1784 /// Serialize a map entry consisting of a key and a value.
1785 ///
1786 /// Some [`Serialize`] types are not able to hold a key and value in memory
1787 /// at the same time so `SerializeMap` implementations are required to
1788 /// support [`serialize_key`] and [`serialize_value`] individually. The
1789 /// `serialize_entry` method allows serializers to optimize for the case
1790 /// where key and value are both available. [`Serialize`] implementations
1791 /// are encouraged to use `serialize_entry` if possible.
1792 ///
1793 /// The default implementation delegates to [`serialize_key`] and
1794 /// [`serialize_value`]. This is appropriate for serializers that do not
1795 /// care about performance or are not able to optimize `serialize_entry` any
1796 /// better than this.
1797 ///
1798 /// [`Serialize`]: ../trait.Serialize.html
1799 /// [`serialize_key`]: #tymethod.serialize_key
1800 /// [`serialize_value`]: #tymethod.serialize_value
serialize_entry<K: ?Sized, V: ?Sized>( &mut self, key: &K, value: &V, ) -> Result<(), Self::Error> where K: Serialize, V: Serialize,1801 fn serialize_entry<K: ?Sized, V: ?Sized>(
1802 &mut self,
1803 key: &K,
1804 value: &V,
1805 ) -> Result<(), Self::Error>
1806 where
1807 K: Serialize,
1808 V: Serialize,
1809 {
1810 tri!(self.serialize_key(key));
1811 self.serialize_value(value)
1812 }
1813
1814 /// Finish serializing a map.
end(self) -> Result<Self::Ok, Self::Error>1815 fn end(self) -> Result<Self::Ok, Self::Error>;
1816 }
1817
1818 /// Returned from `Serializer::serialize_struct`.
1819 ///
1820 /// # Example use
1821 ///
1822 /// ```edition2021
1823 /// use serde::ser::{Serialize, SerializeStruct, Serializer};
1824 ///
1825 /// struct Rgb {
1826 /// r: u8,
1827 /// g: u8,
1828 /// b: u8,
1829 /// }
1830 ///
1831 /// impl Serialize for Rgb {
1832 /// fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
1833 /// where
1834 /// S: Serializer,
1835 /// {
1836 /// let mut rgb = serializer.serialize_struct("Rgb", 3)?;
1837 /// rgb.serialize_field("r", &self.r)?;
1838 /// rgb.serialize_field("g", &self.g)?;
1839 /// rgb.serialize_field("b", &self.b)?;
1840 /// rgb.end()
1841 /// }
1842 /// }
1843 /// ```
1844 ///
1845 /// # Example implementation
1846 ///
1847 /// The [example data format] presented on the website demonstrates an
1848 /// implementation of `SerializeStruct` for a basic JSON data format.
1849 ///
1850 /// [example data format]: https://serde.rs/data-format.html
1851 pub trait SerializeStruct {
1852 /// Must match the `Ok` type of our `Serializer`.
1853 type Ok;
1854
1855 /// Must match the `Error` type of our `Serializer`.
1856 type Error: Error;
1857
1858 /// Serialize a struct field.
serialize_field<T: ?Sized>( &mut self, key: &'static str, value: &T, ) -> Result<(), Self::Error> where T: Serialize1859 fn serialize_field<T: ?Sized>(
1860 &mut self,
1861 key: &'static str,
1862 value: &T,
1863 ) -> Result<(), Self::Error>
1864 where
1865 T: Serialize;
1866
1867 /// Indicate that a struct field has been skipped.
1868 #[inline]
skip_field(&mut self, key: &'static str) -> Result<(), Self::Error>1869 fn skip_field(&mut self, key: &'static str) -> Result<(), Self::Error> {
1870 let _ = key;
1871 Ok(())
1872 }
1873
1874 /// Finish serializing a struct.
end(self) -> Result<Self::Ok, Self::Error>1875 fn end(self) -> Result<Self::Ok, Self::Error>;
1876 }
1877
1878 /// Returned from `Serializer::serialize_struct_variant`.
1879 ///
1880 /// # Example use
1881 ///
1882 /// ```edition2021
1883 /// use serde::ser::{Serialize, SerializeStructVariant, Serializer};
1884 ///
1885 /// enum E {
1886 /// S { r: u8, g: u8, b: u8 },
1887 /// }
1888 ///
1889 /// impl Serialize for E {
1890 /// fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
1891 /// where
1892 /// S: Serializer,
1893 /// {
1894 /// match *self {
1895 /// E::S {
1896 /// ref r,
1897 /// ref g,
1898 /// ref b,
1899 /// } => {
1900 /// let mut sv = serializer.serialize_struct_variant("E", 0, "S", 3)?;
1901 /// sv.serialize_field("r", r)?;
1902 /// sv.serialize_field("g", g)?;
1903 /// sv.serialize_field("b", b)?;
1904 /// sv.end()
1905 /// }
1906 /// }
1907 /// }
1908 /// }
1909 /// ```
1910 ///
1911 /// # Example implementation
1912 ///
1913 /// The [example data format] presented on the website demonstrates an
1914 /// implementation of `SerializeStructVariant` for a basic JSON data format.
1915 ///
1916 /// [example data format]: https://serde.rs/data-format.html
1917 pub trait SerializeStructVariant {
1918 /// Must match the `Ok` type of our `Serializer`.
1919 type Ok;
1920
1921 /// Must match the `Error` type of our `Serializer`.
1922 type Error: Error;
1923
1924 /// Serialize a struct variant field.
serialize_field<T: ?Sized>( &mut self, key: &'static str, value: &T, ) -> Result<(), Self::Error> where T: Serialize1925 fn serialize_field<T: ?Sized>(
1926 &mut self,
1927 key: &'static str,
1928 value: &T,
1929 ) -> Result<(), Self::Error>
1930 where
1931 T: Serialize;
1932
1933 /// Indicate that a struct variant field has been skipped.
1934 #[inline]
skip_field(&mut self, key: &'static str) -> Result<(), Self::Error>1935 fn skip_field(&mut self, key: &'static str) -> Result<(), Self::Error> {
1936 let _ = key;
1937 Ok(())
1938 }
1939
1940 /// Finish serializing a struct variant.
end(self) -> Result<Self::Ok, Self::Error>1941 fn end(self) -> Result<Self::Ok, Self::Error>;
1942 }
1943
iterator_len_hint<I>(iter: &I) -> Option<usize> where I: Iterator,1944 fn iterator_len_hint<I>(iter: &I) -> Option<usize>
1945 where
1946 I: Iterator,
1947 {
1948 match iter.size_hint() {
1949 (lo, Some(hi)) if lo == hi => Some(lo),
1950 _ => None,
1951 }
1952 }
1953