1 // Copyright 2017 Serde Developers
3 // Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
4 // http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
5 // <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
6 // option. This file may not be copied, modified, or distributed
7 // except according to those terms.
11 use ser
::{Serialize, SerializeTuple, Serializer}
;
13 #[cfg(feature = "std")]
16 ////////////////////////////////////////////////////////////////////////////////
18 macro_rules
! primitive_impl
{
19 ($ty
:ident
, $method
:ident $
($cast
:tt
)*) => {
20 impl Serialize
for $ty
{
22 fn serialize
<S
>(&self, serializer
: S
) -> Result
<S
::Ok
, S
::Error
>
26 serializer
.$
method(*self $
($cast
)*)
32 primitive_impl
!(bool
, serialize_bool
);
33 primitive_impl
!(isize, serialize_i64
as i64);
34 primitive_impl
!(i8, serialize_i8
);
35 primitive_impl
!(i16, serialize_i16
);
36 primitive_impl
!(i32, serialize_i32
);
37 primitive_impl
!(i64, serialize_i64
);
38 primitive_impl
!(usize, serialize_u64
as u64);
39 primitive_impl
!(u8, serialize_u8
);
40 primitive_impl
!(u16, serialize_u16
);
41 primitive_impl
!(u32, serialize_u32
);
42 primitive_impl
!(u64, serialize_u64
);
43 primitive_impl
!(f32, serialize_f32
);
44 primitive_impl
!(f64, serialize_f64
);
45 primitive_impl
!(char, serialize_char
);
47 ////////////////////////////////////////////////////////////////////////////////
49 impl Serialize
for str {
51 fn serialize
<S
>(&self, serializer
: S
) -> Result
<S
::Ok
, S
::Error
>
55 serializer
.serialize_str(self)
59 #[cfg(any(feature = "std", feature = "alloc"))]
60 impl Serialize
for String
{
62 fn serialize
<S
>(&self, serializer
: S
) -> Result
<S
::Ok
, S
::Error
>
66 serializer
.serialize_str(self)
70 ////////////////////////////////////////////////////////////////////////////////
72 #[cfg(feature = "std")]
73 impl Serialize
for CStr
{
75 fn serialize
<S
>(&self, serializer
: S
) -> Result
<S
::Ok
, S
::Error
>
79 serializer
.serialize_bytes(self.to_bytes())
83 #[cfg(feature = "std")]
84 impl Serialize
for CString
{
86 fn serialize
<S
>(&self, serializer
: S
) -> Result
<S
::Ok
, S
::Error
>
90 serializer
.serialize_bytes(self.to_bytes())
94 ////////////////////////////////////////////////////////////////////////////////
96 impl<T
> Serialize
for Option
<T
>
101 fn serialize
<S
>(&self, serializer
: S
) -> Result
<S
::Ok
, S
::Error
>
106 Some(ref value
) => serializer
.serialize_some(value
),
107 None
=> serializer
.serialize_none(),
112 ////////////////////////////////////////////////////////////////////////////////
114 impl<T
> Serialize
for PhantomData
<T
> {
116 fn serialize
<S
>(&self, serializer
: S
) -> Result
<S
::Ok
, S
::Error
>
120 serializer
.serialize_unit_struct("PhantomData")
124 ////////////////////////////////////////////////////////////////////////////////
126 // Does not require T: Serialize.
127 impl<T
> Serialize
for [T
; 0] {
129 fn serialize
<S
>(&self, serializer
: S
) -> Result
<S
::Ok
, S
::Error
>
133 try
!(serializer
.serialize_tuple(0)).end()
137 macro_rules
! array_impls
{
140 impl<T
> Serialize
for [T
; $len
]
145 fn serialize
<S
>(&self, serializer
: S
) -> Result
<S
::Ok
, S
::Error
>
149 let mut seq
= try
!(serializer
.serialize_tuple($len
));
151 try
!(seq
.serialize_element(e
));
160 array_impls
!(01 02 03 04 05 06 07 08 09 10
161 11 12 13 14 15 16 17 18 19 20
162 21 22 23 24 25 26 27 28 29 30
165 ////////////////////////////////////////////////////////////////////////////////
167 impl<T
> Serialize
for [T
]
172 fn serialize
<S
>(&self, serializer
: S
) -> Result
<S
::Ok
, S
::Error
>
176 serializer
.collect_seq(self)
180 #[cfg(any(feature = "std", feature = "alloc"))]
181 macro_rules
! seq_impl
{
182 ($ty
:ident
< T $
(: $tbound1
:ident $
(+ $tbound2
:ident
)*)* $
(, $typaram
:ident
: $bound
:ident
)* >) => {
183 impl<T $
(, $typaram
)*> Serialize
for $ty
<T $
(, $typaram
)*>
185 T
: Serialize $
(+ $tbound1 $
(+ $tbound2
)*)*,
186 $
($typaram
: $bound
,)*
189 fn serialize
<S
>(&self, serializer
: S
) -> Result
<S
::Ok
, S
::Error
>
193 serializer
.collect_seq(self)
199 #[cfg(any(feature = "std", feature = "alloc"))]
200 seq_impl
!(BinaryHeap
<T
: Ord
>);
202 #[cfg(any(feature = "std", feature = "alloc"))]
203 seq_impl
!(BTreeSet
<T
: Ord
>);
205 #[cfg(feature = "std")]
206 seq_impl
!(HashSet
<T
: Eq
+ Hash
, H
: BuildHasher
>);
208 #[cfg(any(feature = "std", feature = "alloc"))]
209 seq_impl
!(LinkedList
<T
>);
211 #[cfg(any(feature = "std", feature = "alloc"))]
214 #[cfg(any(feature = "std", feature = "alloc"))]
215 seq_impl
!(VecDeque
<T
>);
217 ////////////////////////////////////////////////////////////////////////////////
219 #[cfg(feature = "std")]
220 impl<Idx
> Serialize
for ops
::Range
<Idx
>
224 fn serialize
<S
>(&self, serializer
: S
) -> Result
<S
::Ok
, S
::Error
>
228 use super::SerializeStruct
;
229 let mut state
= try
!(serializer
.serialize_struct("Range", 2));
230 try
!(state
.serialize_field("start", &self.start
));
231 try
!(state
.serialize_field("end", &self.end
));
236 ////////////////////////////////////////////////////////////////////////////////
238 impl Serialize
for () {
240 fn serialize
<S
>(&self, serializer
: S
) -> Result
<S
::Ok
, S
::Error
>
244 serializer
.serialize_unit()
248 ////////////////////////////////////////////////////////////////////////////////
250 macro_rules
! tuple_impls
{
251 ($
($len
:expr
=> ($
($n
:tt $name
:ident
)+))+) => {
253 impl<$
($name
),+> Serialize
for ($
($name
,)+)
255 $
($name
: Serialize
,)+
258 fn serialize
<S
>(&self, serializer
: S
) -> Result
<S
::Ok
, S
::Error
>
262 let mut tuple
= try
!(serializer
.serialize_tuple($len
));
264 try
!(tuple
.serialize_element(&self.$n
));
276 3 => (0 T0
1 T1
2 T2
)
277 4 => (0 T0
1 T1
2 T2
3 T3
)
278 5 => (0 T0
1 T1
2 T2
3 T3
4 T4
)
279 6 => (0 T0
1 T1
2 T2
3 T3
4 T4
5 T5
)
280 7 => (0 T0
1 T1
2 T2
3 T3
4 T4
5 T5
6 T6
)
281 8 => (0 T0
1 T1
2 T2
3 T3
4 T4
5 T5
6 T6
7 T7
)
282 9 => (0 T0
1 T1
2 T2
3 T3
4 T4
5 T5
6 T6
7 T7
8 T8
)
283 10 => (0 T0
1 T1
2 T2
3 T3
4 T4
5 T5
6 T6
7 T7
8 T8
9 T9
)
284 11 => (0 T0
1 T1
2 T2
3 T3
4 T4
5 T5
6 T6
7 T7
8 T8
9 T9
10 T10
)
285 12 => (0 T0
1 T1
2 T2
3 T3
4 T4
5 T5
6 T6
7 T7
8 T8
9 T9
10 T10
11 T11
)
286 13 => (0 T0
1 T1
2 T2
3 T3
4 T4
5 T5
6 T6
7 T7
8 T8
9 T9
10 T10
11 T11
12 T12
)
287 14 => (0 T0
1 T1
2 T2
3 T3
4 T4
5 T5
6 T6
7 T7
8 T8
9 T9
10 T10
11 T11
12 T12
13 T13
)
288 15 => (0 T0
1 T1
2 T2
3 T3
4 T4
5 T5
6 T6
7 T7
8 T8
9 T9
10 T10
11 T11
12 T12
13 T13
14 T14
)
289 16 => (0 T0
1 T1
2 T2
3 T3
4 T4
5 T5
6 T6
7 T7
8 T8
9 T9
10 T10
11 T11
12 T12
13 T13
14 T14
15 T15
)
292 ////////////////////////////////////////////////////////////////////////////////
294 #[cfg(any(feature = "std", feature = "alloc"))]
295 macro_rules
! map_impl
{
296 ($ty
:ident
< K $
(: $kbound1
:ident $
(+ $kbound2
:ident
)*)*, V $
(, $typaram
:ident
: $bound
:ident
)* >) => {
297 impl<K
, V $
(, $typaram
)*> Serialize
for $ty
<K
, V $
(, $typaram
)*>
299 K
: Serialize $
(+ $kbound1 $
(+ $kbound2
)*)*,
301 $
($typaram
: $bound
,)*
304 fn serialize
<S
>(&self, serializer
: S
) -> Result
<S
::Ok
, S
::Error
>
308 serializer
.collect_map(self)
314 #[cfg(any(feature = "std", feature = "alloc"))]
315 map_impl
!(BTreeMap
<K
: Ord
, V
>);
317 #[cfg(feature = "std")]
318 map_impl
!(HashMap
<K
: Eq
+ Hash
, V
, H
: BuildHasher
>);
320 ////////////////////////////////////////////////////////////////////////////////
322 macro_rules
! deref_impl
{
326 fn serialize
<S
>(&self, serializer
: S
) -> Result
<S
::Ok
, S
::Error
>
330 (**self).serialize(serializer
)
336 deref_impl
!(<'a
, T
: ?Sized
> Serialize
for &'a T
where T
: Serialize
);
337 deref_impl
!(<'a
, T
: ?Sized
> Serialize
for &'a
mut T
where T
: Serialize
);
339 #[cfg(any(feature = "std", feature = "alloc"))]
340 deref_impl
!(<T
: ?Sized
> Serialize
for Box
<T
> where T
: Serialize
);
342 #[cfg(all(feature = "rc", any(feature = "std", feature = "alloc")))]
343 deref_impl
!(<T
> Serialize
for Rc
<T
> where T
: Serialize
);
345 #[cfg(all(feature = "rc", any(feature = "std", feature = "alloc")))]
346 deref_impl
!(<T
> Serialize
for Arc
<T
> where T
: Serialize
);
348 #[cfg(any(feature = "std", feature = "alloc"))]
349 deref_impl
!(<'a
, T
: ?Sized
> Serialize
for Cow
<'a
, T
> where T
: Serialize
+ ToOwned
);
351 ////////////////////////////////////////////////////////////////////////////////
353 #[cfg(feature = "unstable")]
354 impl<T
> Serialize
for NonZero
<T
>
356 T
: Serialize
+ Zeroable
+ Clone
,
358 fn serialize
<S
>(&self, serializer
: S
) -> Result
<S
::Ok
, S
::Error
>
362 self.clone().get().serialize(serializer
)
366 impl<T
> Serialize
for Cell
<T
>
370 fn serialize
<S
>(&self, serializer
: S
) -> Result
<S
::Ok
, S
::Error
>
374 self.get().serialize(serializer
)
378 impl<T
> Serialize
for RefCell
<T
>
382 fn serialize
<S
>(&self, serializer
: S
) -> Result
<S
::Ok
, S
::Error
>
386 self.borrow().serialize(serializer
)
390 #[cfg(feature = "std")]
391 impl<T
> Serialize
for Mutex
<T
>
395 fn serialize
<S
>(&self, serializer
: S
) -> Result
<S
::Ok
, S
::Error
>
400 Ok(locked
) => locked
.serialize(serializer
),
401 Err(_
) => Err(S
::Error
::custom("lock poison error while serializing")),
406 #[cfg(feature = "std")]
407 impl<T
> Serialize
for RwLock
<T
>
411 fn serialize
<S
>(&self, serializer
: S
) -> Result
<S
::Ok
, S
::Error
>
416 Ok(locked
) => locked
.serialize(serializer
),
417 Err(_
) => Err(S
::Error
::custom("lock poison error while serializing")),
422 ////////////////////////////////////////////////////////////////////////////////
424 impl<T
, E
> Serialize
for Result
<T
, E
>
429 fn serialize
<S
>(&self, serializer
: S
) -> Result
<S
::Ok
, S
::Error
>
434 Result
::Ok(ref value
) => serializer
.serialize_newtype_variant("Result", 0, "Ok", value
),
435 Result
::Err(ref value
) => {
436 serializer
.serialize_newtype_variant("Result", 1, "Err", value
)
442 ////////////////////////////////////////////////////////////////////////////////
444 #[cfg(feature = "std")]
445 impl Serialize
for Duration
{
446 fn serialize
<S
>(&self, serializer
: S
) -> Result
<S
::Ok
, S
::Error
>
450 use super::SerializeStruct
;
451 let mut state
= try
!(serializer
.serialize_struct("Duration", 2));
452 try
!(state
.serialize_field("secs", &self.as_secs()));
453 try
!(state
.serialize_field("nanos", &self.subsec_nanos()));
458 ////////////////////////////////////////////////////////////////////////////////
460 #[cfg(feature = "std")]
461 impl Serialize
for SystemTime
{
462 fn serialize
<S
>(&self, serializer
: S
) -> Result
<S
::Ok
, S
::Error
>
466 use super::SerializeStruct
;
467 let duration_since_epoch
= self.duration_since(UNIX_EPOCH
).expect("SystemTime must be later than UNIX_EPOCH");
468 let mut state
= try
!(serializer
.serialize_struct("SystemTime", 2));
469 try
!(state
.serialize_field("secs_since_epoch", &duration_since_epoch
.as_secs()));
470 try
!(state
.serialize_field("nanos_since_epoch", &duration_since_epoch
.subsec_nanos()));
475 ////////////////////////////////////////////////////////////////////////////////
477 /// Serialize a value that implements `Display` as a string, when that string is
478 /// statically known to never have more than a constant `MAX_LEN` bytes.
480 /// Panics if the `Display` impl tries to write more than `MAX_LEN` bytes.
481 #[cfg(feature = "std")]
482 macro_rules
! serialize_display_bounded_length
{
483 ($value
:expr
, $max
:expr
, $serializer
:expr
) => {{
484 let mut buffer
: [u8; $max
] = unsafe { mem::uninitialized() }
;
485 let remaining_len
= {
486 let mut remaining
= &mut buffer
[..];
487 write
!(remaining
, "{}", $value
).unwrap();
490 let written_len
= buffer
.len() - remaining_len
;
491 let written
= &buffer
[..written_len
];
493 // write! only provides fmt::Formatter to Display implementations, which
494 // has methods write_str and write_char but no method to write arbitrary
495 // bytes. Therefore `written` must be valid UTF-8.
496 let written_str
= unsafe {
497 str::from_utf8_unchecked(written
)
499 $serializer
.serialize_str(written_str
)
503 #[cfg(feature = "std")]
504 impl Serialize
for net
::IpAddr
{
505 fn serialize
<S
>(&self, serializer
: S
) -> Result
<S
::Ok
, S
::Error
>
510 net
::IpAddr
::V4(ref a
) => a
.serialize(serializer
),
511 net
::IpAddr
::V6(ref a
) => a
.serialize(serializer
),
516 #[cfg(feature = "std")]
517 impl Serialize
for net
::Ipv4Addr
{
518 fn serialize
<S
>(&self, serializer
: S
) -> Result
<S
::Ok
, S
::Error
>
522 /// "101.102.103.104".len()
523 const MAX_LEN
: usize = 15;
524 serialize_display_bounded_length
!(self, MAX_LEN
, serializer
)
528 #[cfg(feature = "std")]
529 impl Serialize
for net
::Ipv6Addr
{
530 fn serialize
<S
>(&self, serializer
: S
) -> Result
<S
::Ok
, S
::Error
>
534 /// "1000:1002:1003:1004:1005:1006:1007:1008".len()
535 const MAX_LEN
: usize = 39;
536 serialize_display_bounded_length
!(self, MAX_LEN
, serializer
)
540 #[cfg(feature = "std")]
541 impl Serialize
for net
::SocketAddr
{
542 fn serialize
<S
>(&self, serializer
: S
) -> Result
<S
::Ok
, S
::Error
>
547 net
::SocketAddr
::V4(ref addr
) => addr
.serialize(serializer
),
548 net
::SocketAddr
::V6(ref addr
) => addr
.serialize(serializer
),
553 #[cfg(feature = "std")]
554 impl Serialize
for net
::SocketAddrV4
{
555 fn serialize
<S
>(&self, serializer
: S
) -> Result
<S
::Ok
, S
::Error
>
559 /// "101.102.103.104:65000".len()
560 const MAX_LEN
: usize = 21;
561 serialize_display_bounded_length
!(self, MAX_LEN
, serializer
)
565 #[cfg(feature = "std")]
566 impl Serialize
for net
::SocketAddrV6
{
567 fn serialize
<S
>(&self, serializer
: S
) -> Result
<S
::Ok
, S
::Error
>
571 /// "[1000:1002:1003:1004:1005:1006:1007:1008]:65000".len()
572 const MAX_LEN
: usize = 47;
573 serialize_display_bounded_length
!(self, MAX_LEN
, serializer
)
577 ////////////////////////////////////////////////////////////////////////////////
579 #[cfg(feature = "std")]
580 impl Serialize
for Path
{
581 fn serialize
<S
>(&self, serializer
: S
) -> Result
<S
::Ok
, S
::Error
>
585 match self.to_str() {
586 Some(s
) => s
.serialize(serializer
),
587 None
=> Err(Error
::custom("path contains invalid UTF-8 characters")),
592 #[cfg(feature = "std")]
593 impl Serialize
for PathBuf
{
594 fn serialize
<S
>(&self, serializer
: S
) -> Result
<S
::Ok
, S
::Error
>
598 self.as_path().serialize(serializer
)
602 #[cfg(all(feature = "std", any(unix, windows)))]
603 impl Serialize
for OsStr
{
605 fn serialize
<S
>(&self, serializer
: S
) -> Result
<S
::Ok
, S
::Error
>
609 use std
::os
::unix
::ffi
::OsStrExt
;
610 serializer
.serialize_newtype_variant("OsString", 0, "Unix", self.as_bytes())
614 fn serialize
<S
>(&self, serializer
: S
) -> Result
<S
::Ok
, S
::Error
>
618 use std
::os
::windows
::ffi
::OsStrExt
;
619 let val
= self.encode_wide().collect
::<Vec
<_
>>();
620 serializer
.serialize_newtype_variant("OsString", 1, "Windows", &val
)
624 #[cfg(all(feature = "std", any(unix, windows)))]
625 impl Serialize
for OsString
{
626 fn serialize
<S
>(&self, serializer
: S
) -> Result
<S
::Ok
, S
::Error
>
630 self.as_os_str().serialize(serializer
)