1 #[cfg(feature = "std")]
3 #[cfg(all(feature = "collections", not(feature = "std")))]
4 use collections
::borrow
::Cow
;
6 #[cfg(feature = "std")]
7 use std
::collections
::{BinaryHeap, BTreeMap, BTreeSet, LinkedList, HashMap, HashSet, VecDeque}
;
8 #[cfg(all(feature = "collections", not(feature = "std")))]
9 use collections
::{BinaryHeap, BTreeMap, BTreeSet, LinkedList, VecDeque, String, Vec}
;
11 #[cfg(feature = "collections")]
12 use collections
::borrow
::ToOwned
;
14 #[cfg(feature = "std")]
15 use core
::hash
::{Hash, BuildHasher}
;
16 #[cfg(feature = "std")]
18 #[cfg(any(feature = "std", feature = "unstable"))]
20 #[cfg(feature = "std")]
22 #[cfg(feature = "std")]
23 use std
::ffi
::{CString, CStr, OsString, OsStr}
;
24 #[cfg(feature = "std")]
26 #[cfg(all(feature = "alloc", not(feature = "std")))]
28 #[cfg(feature = "std")]
29 use std
::time
::Duration
;
31 #[cfg(feature = "std")]
33 #[cfg(all(feature = "alloc", not(feature = "std")))]
36 #[cfg(all(feature = "alloc", not(feature = "std")))]
37 use alloc
::boxed
::Box
;
39 use core
::cell
::{Cell, RefCell}
;
41 #[cfg(feature = "std")]
42 use std
::sync
::{Mutex, RwLock}
;
44 use core
::marker
::PhantomData
;
46 #[cfg(feature = "unstable")]
47 use core
::nonzero
::{NonZero, Zeroable}
;
49 use super::{Serialize, SerializeSeq, SerializeTuple, Serializer}
;
50 #[cfg(feature = "std")]
53 ///////////////////////////////////////////////////////////////////////////////
55 macro_rules
! impl_visit
{
56 ($ty
:ty
, $method
:ident $
($cast
:tt
)*) => {
57 impl Serialize
for $ty
{
59 fn serialize
<S
>(&self, serializer
: S
) -> Result
<S
::Ok
, S
::Error
>
62 serializer
.$
method(*self $
($cast
)*)
68 impl_visit
!(bool
, serialize_bool
);
69 impl_visit
!(isize, serialize_i64
as i64);
70 impl_visit
!(i8, serialize_i8
);
71 impl_visit
!(i16, serialize_i16
);
72 impl_visit
!(i32, serialize_i32
);
73 impl_visit
!(i64, serialize_i64
);
74 impl_visit
!(usize, serialize_u64
as u64);
75 impl_visit
!(u8, serialize_u8
);
76 impl_visit
!(u16, serialize_u16
);
77 impl_visit
!(u32, serialize_u32
);
78 impl_visit
!(u64, serialize_u64
);
79 impl_visit
!(f32, serialize_f32
);
80 impl_visit
!(f64, serialize_f64
);
81 impl_visit
!(char, serialize_char
);
83 ///////////////////////////////////////////////////////////////////////////////
85 impl Serialize
for str {
87 fn serialize
<S
>(&self, serializer
: S
) -> Result
<S
::Ok
, S
::Error
>
90 serializer
.serialize_str(self)
94 #[cfg(any(feature = "std", feature = "collections"))]
95 impl Serialize
for String
{
97 fn serialize
<S
>(&self, serializer
: S
) -> Result
<S
::Ok
, S
::Error
>
100 (&self[..]).serialize(serializer
)
104 ///////////////////////////////////////////////////////////////////////////////
106 #[cfg(feature = "std")]
107 impl Serialize
for CStr
{
109 fn serialize
<S
>(&self, serializer
: S
) -> Result
<S
::Ok
, S
::Error
>
112 serializer
.serialize_bytes(self.to_bytes())
116 #[cfg(feature = "std")]
117 impl Serialize
for CString
{
119 fn serialize
<S
>(&self, serializer
: S
) -> Result
<S
::Ok
, S
::Error
>
122 serializer
.serialize_bytes(self.to_bytes())
126 ///////////////////////////////////////////////////////////////////////////////
128 impl<T
> Serialize
for Option
<T
>
132 fn serialize
<S
>(&self, serializer
: S
) -> Result
<S
::Ok
, S
::Error
>
136 Some(ref value
) => serializer
.serialize_some(value
),
137 None
=> serializer
.serialize_none(),
142 ///////////////////////////////////////////////////////////////////////////////
144 impl<T
> Serialize
for PhantomData
<T
> {
146 fn serialize
<S
>(&self, serializer
: S
) -> Result
<S
::Ok
, S
::Error
>
149 serializer
.serialize_unit_struct("PhantomData")
153 ///////////////////////////////////////////////////////////////////////////////
155 macro_rules
! array_impls
{
157 impl<T
> Serialize
for [T
; $len
] where T
: Serialize
{
159 fn serialize
<S
>(&self, serializer
: S
) -> Result
<S
::Ok
, S
::Error
>
162 let mut seq
= try
!(serializer
.serialize_seq_fixed_size($len
));
164 try
!(seq
.serialize_element(e
));
206 ///////////////////////////////////////////////////////////////////////////////
208 macro_rules
! serialize_seq
{
211 fn serialize
<S
>(&self, serializer
: S
) -> Result
<S
::Ok
, S
::Error
>
214 serializer
.collect_seq(self)
219 impl<T
> Serialize
for [T
]
225 #[cfg(any(feature = "std", feature = "collections"))]
226 impl<T
> Serialize
for BinaryHeap
<T
>
227 where T
: Serialize
+ Ord
232 #[cfg(any(feature = "std", feature = "collections"))]
233 impl<T
> Serialize
for BTreeSet
<T
>
234 where T
: Serialize
+ Ord
239 #[cfg(feature = "std")]
240 impl<T
, H
> Serialize
for HashSet
<T
, H
>
241 where T
: Serialize
+ Eq
+ Hash
,
247 #[cfg(any(feature = "std", feature = "collections"))]
248 impl<T
> Serialize
for LinkedList
<T
>
254 #[cfg(any(feature = "std", feature = "collections"))]
255 impl<T
> Serialize
for Vec
<T
>
261 #[cfg(any(feature = "std", feature = "collections"))]
262 impl<T
> Serialize
for VecDeque
<T
>
268 ///////////////////////////////////////////////////////////////////////////////
270 #[cfg(feature = "std")]
271 impl<Idx
: Serialize
> Serialize
for ops
::Range
<Idx
> {
272 fn serialize
<S
>(&self, serializer
: S
) -> Result
<S
::Ok
, S
::Error
>
275 use super::SerializeStruct
;
276 let mut state
= try
!(serializer
.serialize_struct("Range", 2));
277 try
!(state
.serialize_field("start", &self.start
));
278 try
!(state
.serialize_field("end", &self.end
));
283 ///////////////////////////////////////////////////////////////////////////////
285 impl Serialize
for () {
287 fn serialize
<S
>(&self, serializer
: S
) -> Result
<S
::Ok
, S
::Error
>
290 serializer
.serialize_unit()
294 ///////////////////////////////////////////////////////////////////////////////
296 macro_rules
! tuple_impls
{
298 $TupleVisitor
:ident ($len
:expr
, $
($T
:ident
),+) {
299 $
($state
:pat
=> $idx
:tt
,)+
303 impl<$
($T
),+> Serialize
for ($
($T
,)+)
304 where $
($T
: Serialize
),+
307 fn serialize
<S
>(&self, serializer
: S
) -> Result
<S
::Ok
, S
::Error
>
310 let mut tuple
= try
!(serializer
.serialize_tuple($len
));
312 try
!(tuple
.serialize_element(&self.$idx
));
322 TupleVisitor1 (1, T0
) {
325 TupleVisitor2 (2, T0
, T1
) {
329 TupleVisitor3 (3, T0
, T1
, T2
) {
334 TupleVisitor4 (4, T0
, T1
, T2
, T3
) {
340 TupleVisitor5 (5, T0
, T1
, T2
, T3
, T4
) {
347 TupleVisitor6 (6, T0
, T1
, T2
, T3
, T4
, T5
) {
355 TupleVisitor7 (7, T0
, T1
, T2
, T3
, T4
, T5
, T6
) {
364 TupleVisitor8 (8, T0
, T1
, T2
, T3
, T4
, T5
, T6
, T7
) {
374 TupleVisitor9 (9, T0
, T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
) {
385 TupleVisitor10 (10, T0
, T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
) {
397 TupleVisitor11 (11, T0
, T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
) {
410 TupleVisitor12 (12, T0
, T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
) {
424 TupleVisitor13 (13, T0
, T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
) {
439 TupleVisitor14 (14, T0
, T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
) {
455 TupleVisitor15 (15, T0
, T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
, T14
) {
472 TupleVisitor16 (16, T0
, T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
, T9
, T10
, T11
, T12
, T13
, T14
, T15
) {
492 ///////////////////////////////////////////////////////////////////////////////
494 macro_rules
! serialize_map
{
497 fn serialize
<S
>(&self, serializer
: S
) -> Result
<S
::Ok
, S
::Error
>
500 serializer
.collect_map(self)
505 #[cfg(any(feature = "std", feature = "collections"))]
506 impl<K
, V
> Serialize
for BTreeMap
<K
, V
>
507 where K
: Serialize
+ Ord
,
513 #[cfg(feature = "std")]
514 impl<K
, V
, H
> Serialize
for HashMap
<K
, V
, H
>
515 where K
: Serialize
+ Eq
+ Hash
,
522 ///////////////////////////////////////////////////////////////////////////////
524 impl<'a
, T
: ?Sized
> Serialize
for &'a T
528 fn serialize
<S
>(&self, serializer
: S
) -> Result
<S
::Ok
, S
::Error
>
531 (**self).serialize(serializer
)
535 impl<'a
, T
: ?Sized
> Serialize
for &'a
mut T
539 fn serialize
<S
>(&self, serializer
: S
) -> Result
<S
::Ok
, S
::Error
>
542 (**self).serialize(serializer
)
546 #[cfg(any(feature = "std", feature = "alloc"))]
547 impl<T
: ?Sized
> Serialize
for Box
<T
>
551 fn serialize
<S
>(&self, serializer
: S
) -> Result
<S
::Ok
, S
::Error
>
554 (**self).serialize(serializer
)
558 #[cfg(any(feature = "std", feature = "alloc"))]
559 impl<T
> Serialize
for Rc
<T
>
563 fn serialize
<S
>(&self, serializer
: S
) -> Result
<S
::Ok
, S
::Error
>
566 (**self).serialize(serializer
)
570 #[cfg(any(feature = "std", feature = "alloc"))]
571 impl<T
> Serialize
for Arc
<T
>
575 fn serialize
<S
>(&self, serializer
: S
) -> Result
<S
::Ok
, S
::Error
>
578 (**self).serialize(serializer
)
582 #[cfg(any(feature = "std", feature = "collections"))]
583 impl<'a
, T
: ?Sized
> Serialize
for Cow
<'a
, T
>
584 where T
: Serialize
+ ToOwned
587 fn serialize
<S
>(&self, serializer
: S
) -> Result
<S
::Ok
, S
::Error
>
590 (**self).serialize(serializer
)
594 impl<T
> Serialize
for Cell
<T
>
595 where T
: Serialize
+ Copy
598 fn serialize
<S
>(&self, serializer
: S
) -> Result
<S
::Ok
, S
::Error
>
601 self.get().serialize(serializer
)
605 impl<T
> Serialize
for RefCell
<T
>
609 fn serialize
<S
>(&self, serializer
: S
) -> Result
<S
::Ok
, S
::Error
>
612 self.borrow().serialize(serializer
)
616 #[cfg(feature = "std")]
617 impl<T
> Serialize
for Mutex
<T
>
621 fn serialize
<S
>(&self, serializer
: S
) -> Result
<S
::Ok
, S
::Error
>
625 Ok(locked
) => locked
.serialize(serializer
),
626 Err(_
) => Err(S
::Error
::custom("lock poison error while serializing")),
631 #[cfg(feature = "std")]
632 impl<T
> Serialize
for RwLock
<T
>
636 fn serialize
<S
>(&self, serializer
: S
) -> Result
<S
::Ok
, S
::Error
>
640 Ok(locked
) => locked
.serialize(serializer
),
641 Err(_
) => Err(S
::Error
::custom("lock poison error while serializing")),
646 ///////////////////////////////////////////////////////////////////////////////
648 impl<T
, E
> Serialize
for Result
<T
, E
>
652 fn serialize
<S
>(&self, serializer
: S
) -> Result
<S
::Ok
, S
::Error
>
656 Result
::Ok(ref value
) => serializer
.serialize_newtype_variant("Result", 0, "Ok", value
),
657 Result
::Err(ref value
) => {
658 serializer
.serialize_newtype_variant("Result", 1, "Err", value
)
664 ///////////////////////////////////////////////////////////////////////////////
666 #[cfg(feature = "std")]
667 impl Serialize
for Duration
{
668 fn serialize
<S
>(&self, serializer
: S
) -> Result
<S
::Ok
, S
::Error
>
671 use super::SerializeStruct
;
672 let mut state
= try
!(serializer
.serialize_struct("Duration", 2));
673 try
!(state
.serialize_field("secs", &self.as_secs()));
674 try
!(state
.serialize_field("nanos", &self.subsec_nanos()));
679 ///////////////////////////////////////////////////////////////////////////////
681 #[cfg(feature = "std")]
682 impl Serialize
for net
::IpAddr
{
683 fn serialize
<S
>(&self, serializer
: S
) -> Result
<S
::Ok
, S
::Error
>
687 net
::IpAddr
::V4(ref a
) => a
.serialize(serializer
),
688 net
::IpAddr
::V6(ref a
) => a
.serialize(serializer
),
693 #[cfg(feature = "std")]
694 impl Serialize
for net
::Ipv4Addr
{
695 fn serialize
<S
>(&self, serializer
: S
) -> Result
<S
::Ok
, S
::Error
>
698 /// "101.102.103.104".len()
699 const MAX_LEN
: usize = 15;
700 serialize_display_bounded_length
!(self, MAX_LEN
, serializer
)
704 #[cfg(feature = "std")]
705 impl Serialize
for net
::Ipv6Addr
{
706 fn serialize
<S
>(&self, serializer
: S
) -> Result
<S
::Ok
, S
::Error
>
709 /// "1000:1002:1003:1004:1005:1006:1007:1008".len()
710 const MAX_LEN
: usize = 39;
711 serialize_display_bounded_length
!(self, MAX_LEN
, serializer
)
715 ///////////////////////////////////////////////////////////////////////////////
717 #[cfg(feature = "std")]
718 impl Serialize
for net
::SocketAddr
{
719 fn serialize
<S
>(&self, serializer
: S
) -> Result
<S
::Ok
, S
::Error
>
723 net
::SocketAddr
::V4(ref addr
) => addr
.serialize(serializer
),
724 net
::SocketAddr
::V6(ref addr
) => addr
.serialize(serializer
),
729 #[cfg(feature = "std")]
730 impl Serialize
for net
::SocketAddrV4
{
731 fn serialize
<S
>(&self, serializer
: S
) -> Result
<S
::Ok
, S
::Error
>
734 /// "101.102.103.104:65000".len()
735 const MAX_LEN
: usize = 21;
736 serialize_display_bounded_length
!(self, MAX_LEN
, serializer
)
740 #[cfg(feature = "std")]
741 impl Serialize
for net
::SocketAddrV6
{
742 fn serialize
<S
>(&self, serializer
: S
) -> Result
<S
::Ok
, S
::Error
>
745 /// "[1000:1002:1003:1004:1005:1006:1007:1008]:65000".len()
746 const MAX_LEN
: usize = 47;
747 serialize_display_bounded_length
!(self, MAX_LEN
, serializer
)
751 ///////////////////////////////////////////////////////////////////////////////
753 #[cfg(feature = "std")]
754 impl Serialize
for path
::Path
{
755 fn serialize
<S
>(&self, serializer
: S
) -> Result
<S
::Ok
, S
::Error
>
758 match self.to_str() {
759 Some(s
) => s
.serialize(serializer
),
760 None
=> Err(Error
::custom("path contains invalid UTF-8 characters")),
765 #[cfg(feature = "std")]
766 impl Serialize
for path
::PathBuf
{
767 fn serialize
<S
>(&self, serializer
: S
) -> Result
<S
::Ok
, S
::Error
>
770 self.as_path().serialize(serializer
)
774 #[cfg(all(feature = "std", any(unix, windows)))]
775 impl Serialize
for OsStr
{
777 fn serialize
<S
>(&self, serializer
: S
) -> Result
<S
::Ok
, S
::Error
>
780 use std
::os
::unix
::ffi
::OsStrExt
;
781 serializer
.serialize_newtype_variant("OsString",
787 fn serialize
<S
>(&self, serializer
: S
) -> Result
<S
::Ok
, S
::Error
>
790 use std
::os
::windows
::ffi
::OsStrExt
;
791 let val
= self.encode_wide().collect
::<Vec
<_
>>();
792 serializer
.serialize_newtype_variant("OsString",
799 #[cfg(all(feature = "std", any(unix, windows)))]
800 #[cfg(feature = "std")]
801 impl Serialize
for OsString
{
802 fn serialize
<S
>(&self, serializer
: S
) -> Result
<S
::Ok
, S
::Error
>
805 self.as_os_str().serialize(serializer
)
809 #[cfg(feature = "unstable")]
810 impl<T
> Serialize
for NonZero
<T
>
811 where T
: Serialize
+ Zeroable
813 fn serialize
<S
>(&self, serializer
: S
) -> Result
<S
::Ok
, S
::Error
>
816 (**self).serialize(serializer
)