]> git.proxmox.com Git - rustc.git/blame - vendor/serde/src/ser/impls.rs
New upstream version 1.60.0+dfsg1
[rustc.git] / vendor / serde / src / ser / impls.rs
CommitLineData
041b39d2
XL
1use lib::*;
2
8faf50e0 3use ser::{Error, Serialize, SerializeTuple, Serializer};
041b39d2
XL
4
5////////////////////////////////////////////////////////////////////////////////
6
7macro_rules! primitive_impl {
8 ($ty:ident, $method:ident $($cast:tt)*) => {
9 impl Serialize for $ty {
10 #[inline]
11 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
12 where
13 S: Serializer,
14 {
15 serializer.$method(*self $($cast)*)
16 }
17 }
18 }
19}
20
21primitive_impl!(bool, serialize_bool);
22primitive_impl!(isize, serialize_i64 as i64);
23primitive_impl!(i8, serialize_i8);
24primitive_impl!(i16, serialize_i16);
25primitive_impl!(i32, serialize_i32);
26primitive_impl!(i64, serialize_i64);
27primitive_impl!(usize, serialize_u64 as u64);
28primitive_impl!(u8, serialize_u8);
29primitive_impl!(u16, serialize_u16);
30primitive_impl!(u32, serialize_u32);
31primitive_impl!(u64, serialize_u64);
32primitive_impl!(f32, serialize_f32);
33primitive_impl!(f64, serialize_f64);
34primitive_impl!(char, serialize_char);
35
8faf50e0
XL
36serde_if_integer128! {
37 primitive_impl!(i128, serialize_i128);
38 primitive_impl!(u128, serialize_u128);
39}
40
041b39d2
XL
41////////////////////////////////////////////////////////////////////////////////
42
43impl Serialize for str {
44 #[inline]
45 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
46 where
47 S: Serializer,
48 {
49 serializer.serialize_str(self)
50 }
51}
52
53#[cfg(any(feature = "std", feature = "alloc"))]
54impl Serialize for String {
55 #[inline]
56 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
57 where
58 S: Serializer,
59 {
60 serializer.serialize_str(self)
61 }
62}
63
8faf50e0
XL
64impl<'a> Serialize for fmt::Arguments<'a> {
65 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
66 where
67 S: Serializer,
68 {
69 serializer.collect_str(self)
70 }
71}
72
041b39d2
XL
73////////////////////////////////////////////////////////////////////////////////
74
75#[cfg(feature = "std")]
76impl Serialize for CStr {
77 #[inline]
78 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
79 where
80 S: Serializer,
81 {
82 serializer.serialize_bytes(self.to_bytes())
83 }
84}
85
86#[cfg(feature = "std")]
87impl Serialize for CString {
88 #[inline]
89 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
90 where
91 S: Serializer,
92 {
93 serializer.serialize_bytes(self.to_bytes())
94 }
95}
96
97////////////////////////////////////////////////////////////////////////////////
98
99impl<T> Serialize for Option<T>
100where
101 T: Serialize,
102{
103 #[inline]
104 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
105 where
106 S: Serializer,
107 {
108 match *self {
109 Some(ref value) => serializer.serialize_some(value),
110 None => serializer.serialize_none(),
111 }
112 }
113}
114
115////////////////////////////////////////////////////////////////////////////////
116
2c00a5a8 117impl<T: ?Sized> Serialize for PhantomData<T> {
041b39d2
XL
118 #[inline]
119 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
120 where
121 S: Serializer,
122 {
123 serializer.serialize_unit_struct("PhantomData")
124 }
125}
126
127////////////////////////////////////////////////////////////////////////////////
128
129// Does not require T: Serialize.
130impl<T> Serialize for [T; 0] {
131 #[inline]
132 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
133 where
134 S: Serializer,
135 {
136 try!(serializer.serialize_tuple(0)).end()
137 }
138}
139
140macro_rules! array_impls {
141 ($($len:tt)+) => {
142 $(
143 impl<T> Serialize for [T; $len]
144 where
145 T: Serialize,
146 {
147 #[inline]
148 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
149 where
150 S: Serializer,
151 {
152 let mut seq = try!(serializer.serialize_tuple($len));
153 for e in self {
154 try!(seq.serialize_element(e));
155 }
156 seq.end()
157 }
158 }
159 )+
160 }
161}
162
dc9dc135
XL
163array_impls! {
164 01 02 03 04 05 06 07 08 09 10
165 11 12 13 14 15 16 17 18 19 20
166 21 22 23 24 25 26 27 28 29 30
167 31 32
168}
041b39d2
XL
169
170////////////////////////////////////////////////////////////////////////////////
171
172impl<T> Serialize for [T]
173where
174 T: Serialize,
175{
176 #[inline]
177 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
178 where
179 S: Serializer,
180 {
181 serializer.collect_seq(self)
182 }
183}
184
185#[cfg(any(feature = "std", feature = "alloc"))]
186macro_rules! seq_impl {
187 ($ty:ident < T $(: $tbound1:ident $(+ $tbound2:ident)*)* $(, $typaram:ident : $bound:ident)* >) => {
188 impl<T $(, $typaram)*> Serialize for $ty<T $(, $typaram)*>
189 where
190 T: Serialize $(+ $tbound1 $(+ $tbound2)*)*,
191 $($typaram: $bound,)*
192 {
193 #[inline]
194 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
195 where
196 S: Serializer,
197 {
198 serializer.collect_seq(self)
199 }
200 }
201 }
202}
203
204#[cfg(any(feature = "std", feature = "alloc"))]
205seq_impl!(BinaryHeap<T: Ord>);
206
207#[cfg(any(feature = "std", feature = "alloc"))]
208seq_impl!(BTreeSet<T: Ord>);
209
210#[cfg(feature = "std")]
211seq_impl!(HashSet<T: Eq + Hash, H: BuildHasher>);
212
213#[cfg(any(feature = "std", feature = "alloc"))]
214seq_impl!(LinkedList<T>);
215
216#[cfg(any(feature = "std", feature = "alloc"))]
217seq_impl!(Vec<T>);
218
219#[cfg(any(feature = "std", feature = "alloc"))]
220seq_impl!(VecDeque<T>);
221
222////////////////////////////////////////////////////////////////////////////////
223
b7449926 224impl<Idx> Serialize for Range<Idx>
041b39d2
XL
225where
226 Idx: Serialize,
227{
228 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
229 where
230 S: Serializer,
231 {
232 use super::SerializeStruct;
233 let mut state = try!(serializer.serialize_struct("Range", 2));
234 try!(state.serialize_field("start", &self.start));
235 try!(state.serialize_field("end", &self.end));
236 state.end()
237 }
238}
239
240////////////////////////////////////////////////////////////////////////////////
241
5099ac24 242#[cfg(not(no_range_inclusive))]
b7449926
XL
243impl<Idx> Serialize for RangeInclusive<Idx>
244where
245 Idx: Serialize,
246{
247 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
248 where
249 S: Serializer,
250 {
251 use super::SerializeStruct;
252 let mut state = try!(serializer.serialize_struct("RangeInclusive", 2));
253 try!(state.serialize_field("start", &self.start()));
254 try!(state.serialize_field("end", &self.end()));
255 state.end()
256 }
257}
258
259////////////////////////////////////////////////////////////////////////////////
260
5099ac24 261#[cfg(any(not(no_ops_bound), all(feature = "std", not(no_collections_bound))))]
dc9dc135
XL
262impl<T> Serialize for Bound<T>
263where
264 T: Serialize,
265{
266 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
267 where
268 S: Serializer,
269 {
270 match *self {
271 Bound::Unbounded => serializer.serialize_unit_variant("Bound", 0, "Unbounded"),
272 Bound::Included(ref value) => {
273 serializer.serialize_newtype_variant("Bound", 1, "Included", value)
274 }
275 Bound::Excluded(ref value) => {
276 serializer.serialize_newtype_variant("Bound", 2, "Excluded", value)
277 }
278 }
279 }
280}
281
282////////////////////////////////////////////////////////////////////////////////
283
041b39d2
XL
284impl Serialize for () {
285 #[inline]
286 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
287 where
288 S: Serializer,
289 {
290 serializer.serialize_unit()
291 }
292}
293
8faf50e0
XL
294#[cfg(feature = "unstable")]
295impl Serialize for ! {
296 fn serialize<S>(&self, _serializer: S) -> Result<S::Ok, S::Error>
297 where
298 S: Serializer,
299 {
300 *self
301 }
302}
303
041b39d2
XL
304////////////////////////////////////////////////////////////////////////////////
305
306macro_rules! tuple_impls {
307 ($($len:expr => ($($n:tt $name:ident)+))+) => {
308 $(
309 impl<$($name),+> Serialize for ($($name,)+)
310 where
311 $($name: Serialize,)+
312 {
313 #[inline]
314 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
315 where
316 S: Serializer,
317 {
318 let mut tuple = try!(serializer.serialize_tuple($len));
319 $(
320 try!(tuple.serialize_element(&self.$n));
321 )+
322 tuple.end()
323 }
324 }
325 )+
326 }
327}
328
329tuple_impls! {
330 1 => (0 T0)
331 2 => (0 T0 1 T1)
332 3 => (0 T0 1 T1 2 T2)
333 4 => (0 T0 1 T1 2 T2 3 T3)
334 5 => (0 T0 1 T1 2 T2 3 T3 4 T4)
335 6 => (0 T0 1 T1 2 T2 3 T3 4 T4 5 T5)
336 7 => (0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6)
337 8 => (0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7)
338 9 => (0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 8 T8)
339 10 => (0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 8 T8 9 T9)
340 11 => (0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 8 T8 9 T9 10 T10)
341 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)
342 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)
343 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)
344 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)
345 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)
346}
347
348////////////////////////////////////////////////////////////////////////////////
349
350#[cfg(any(feature = "std", feature = "alloc"))]
351macro_rules! map_impl {
352 ($ty:ident < K $(: $kbound1:ident $(+ $kbound2:ident)*)*, V $(, $typaram:ident : $bound:ident)* >) => {
353 impl<K, V $(, $typaram)*> Serialize for $ty<K, V $(, $typaram)*>
354 where
355 K: Serialize $(+ $kbound1 $(+ $kbound2)*)*,
356 V: Serialize,
357 $($typaram: $bound,)*
358 {
359 #[inline]
360 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
361 where
362 S: Serializer,
363 {
364 serializer.collect_map(self)
365 }
366 }
367 }
368}
369
370#[cfg(any(feature = "std", feature = "alloc"))]
371map_impl!(BTreeMap<K: Ord, V>);
372
373#[cfg(feature = "std")]
374map_impl!(HashMap<K: Eq + Hash, V, H: BuildHasher>);
375
376////////////////////////////////////////////////////////////////////////////////
377
378macro_rules! deref_impl {
83c7162d
XL
379 (
380 $(#[doc = $doc:tt])*
381 <$($desc:tt)+
382 ) => {
383 $(#[doc = $doc])*
384 impl <$($desc)+ {
041b39d2
XL
385 #[inline]
386 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
387 where
388 S: Serializer,
389 {
390 (**self).serialize(serializer)
391 }
392 }
393 };
394}
395
396deref_impl!(<'a, T: ?Sized> Serialize for &'a T where T: Serialize);
397deref_impl!(<'a, T: ?Sized> Serialize for &'a mut T where T: Serialize);
398
399#[cfg(any(feature = "std", feature = "alloc"))]
400deref_impl!(<T: ?Sized> Serialize for Box<T> where T: Serialize);
401
402#[cfg(all(feature = "rc", any(feature = "std", feature = "alloc")))]
83c7162d
XL
403deref_impl! {
404 /// This impl requires the [`"rc"`] Cargo feature of Serde.
405 ///
406 /// Serializing a data structure containing `Rc` will serialize a copy of
407 /// the contents of the `Rc` each time the `Rc` is referenced within the
408 /// data structure. Serialization will not attempt to deduplicate these
409 /// repeated data.
410 ///
411 /// [`"rc"`]: https://serde.rs/feature-flags.html#-features-rc
412 <T: ?Sized> Serialize for Rc<T> where T: Serialize
413}
041b39d2
XL
414
415#[cfg(all(feature = "rc", any(feature = "std", feature = "alloc")))]
83c7162d
XL
416deref_impl! {
417 /// This impl requires the [`"rc"`] Cargo feature of Serde.
418 ///
419 /// Serializing a data structure containing `Arc` will serialize a copy of
420 /// the contents of the `Arc` each time the `Arc` is referenced within the
421 /// data structure. Serialization will not attempt to deduplicate these
422 /// repeated data.
423 ///
424 /// [`"rc"`]: https://serde.rs/feature-flags.html#-features-rc
425 <T: ?Sized> Serialize for Arc<T> where T: Serialize
426}
041b39d2
XL
427
428#[cfg(any(feature = "std", feature = "alloc"))]
429deref_impl!(<'a, T: ?Sized> Serialize for Cow<'a, T> where T: Serialize + ToOwned);
430
431////////////////////////////////////////////////////////////////////////////////
432
8faf50e0
XL
433/// This impl requires the [`"rc"`] Cargo feature of Serde.
434///
435/// [`"rc"`]: https://serde.rs/feature-flags.html#-features-rc
436#[cfg(all(feature = "rc", any(feature = "std", feature = "alloc")))]
437impl<T: ?Sized> Serialize for RcWeak<T>
041b39d2 438where
8faf50e0 439 T: Serialize,
041b39d2
XL
440{
441 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
442 where
443 S: Serializer,
444 {
8faf50e0 445 self.upgrade().serialize(serializer)
041b39d2
XL
446 }
447}
448
8faf50e0
XL
449/// This impl requires the [`"rc"`] Cargo feature of Serde.
450///
451/// [`"rc"`]: https://serde.rs/feature-flags.html#-features-rc
452#[cfg(all(feature = "rc", any(feature = "std", feature = "alloc")))]
453impl<T: ?Sized> Serialize for ArcWeak<T>
454where
455 T: Serialize,
456{
457 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
458 where
459 S: Serializer,
460 {
461 self.upgrade().serialize(serializer)
462 }
463}
464
465////////////////////////////////////////////////////////////////////////////////
466
0531ce1d
XL
467macro_rules! nonzero_integers {
468 ( $( $T: ident, )+ ) => {
469 $(
5099ac24 470 #[cfg(not(no_num_nonzero))]
8faf50e0 471 impl Serialize for num::$T {
0531ce1d
XL
472 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
473 where
474 S: Serializer,
475 {
476 self.get().serialize(serializer)
477 }
478 }
479 )+
480 }
481}
482
483nonzero_integers! {
0531ce1d
XL
484 NonZeroU8,
485 NonZeroU16,
486 NonZeroU32,
487 NonZeroU64,
0531ce1d
XL
488 NonZeroUsize,
489}
490
5099ac24 491#[cfg(not(no_num_nonzero_signed))]
e1599b0c
XL
492nonzero_integers! {
493 NonZeroI8,
494 NonZeroI16,
495 NonZeroI32,
496 NonZeroI64,
497 NonZeroIsize,
498}
499
0731742a
XL
500// Currently 128-bit integers do not work on Emscripten targets so we need an
501// additional `#[cfg]`
502serde_if_integer128! {
503 nonzero_integers! {
504 NonZeroU128,
505 }
e1599b0c 506
5099ac24 507 #[cfg(not(no_num_nonzero_signed))]
e1599b0c
XL
508 nonzero_integers! {
509 NonZeroI128,
510 }
0731742a
XL
511}
512
041b39d2
XL
513impl<T> Serialize for Cell<T>
514where
515 T: Serialize + Copy,
516{
517 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
518 where
519 S: Serializer,
520 {
521 self.get().serialize(serializer)
522 }
523}
524
525impl<T> Serialize for RefCell<T>
526where
527 T: Serialize,
528{
529 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
530 where
531 S: Serializer,
532 {
8faf50e0
XL
533 match self.try_borrow() {
534 Ok(value) => value.serialize(serializer),
535 Err(_) => Err(S::Error::custom("already mutably borrowed")),
536 }
041b39d2
XL
537 }
538}
539
540#[cfg(feature = "std")]
541impl<T> Serialize for Mutex<T>
542where
543 T: Serialize,
544{
545 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
546 where
547 S: Serializer,
548 {
549 match self.lock() {
550 Ok(locked) => locked.serialize(serializer),
551 Err(_) => Err(S::Error::custom("lock poison error while serializing")),
552 }
553 }
554}
555
556#[cfg(feature = "std")]
557impl<T> Serialize for RwLock<T>
558where
559 T: Serialize,
560{
561 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
562 where
563 S: Serializer,
564 {
565 match self.read() {
566 Ok(locked) => locked.serialize(serializer),
567 Err(_) => Err(S::Error::custom("lock poison error while serializing")),
568 }
569 }
570}
571
572////////////////////////////////////////////////////////////////////////////////
573
574impl<T, E> Serialize for Result<T, E>
575where
576 T: Serialize,
577 E: Serialize,
578{
579 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
580 where
581 S: Serializer,
582 {
583 match *self {
584 Result::Ok(ref value) => serializer.serialize_newtype_variant("Result", 0, "Ok", value),
585 Result::Err(ref value) => {
586 serializer.serialize_newtype_variant("Result", 1, "Err", value)
587 }
588 }
589 }
590}
591
592////////////////////////////////////////////////////////////////////////////////
593
5099ac24 594#[cfg(any(feature = "std", not(no_core_duration)))]
041b39d2
XL
595impl Serialize for Duration {
596 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
597 where
598 S: Serializer,
599 {
600 use super::SerializeStruct;
601 let mut state = try!(serializer.serialize_struct("Duration", 2));
602 try!(state.serialize_field("secs", &self.as_secs()));
603 try!(state.serialize_field("nanos", &self.subsec_nanos()));
604 state.end()
605 }
606}
607
608////////////////////////////////////////////////////////////////////////////////
609
610#[cfg(feature = "std")]
611impl Serialize for SystemTime {
612 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
613 where
614 S: Serializer,
615 {
616 use super::SerializeStruct;
8faf50e0
XL
617 let duration_since_epoch = self
618 .duration_since(UNIX_EPOCH)
f035d41b 619 .map_err(|_| S::Error::custom("SystemTime must be later than UNIX_EPOCH"))?;
041b39d2
XL
620 let mut state = try!(serializer.serialize_struct("SystemTime", 2));
621 try!(state.serialize_field("secs_since_epoch", &duration_since_epoch.as_secs()));
622 try!(state.serialize_field("nanos_since_epoch", &duration_since_epoch.subsec_nanos()));
623 state.end()
624 }
625}
626
627////////////////////////////////////////////////////////////////////////////////
628
629/// Serialize a value that implements `Display` as a string, when that string is
630/// statically known to never have more than a constant `MAX_LEN` bytes.
631///
632/// Panics if the `Display` impl tries to write more than `MAX_LEN` bytes.
633#[cfg(feature = "std")]
634macro_rules! serialize_display_bounded_length {
635 ($value:expr, $max:expr, $serializer:expr) => {{
f035d41b 636 let mut buffer = [0u8; $max];
041b39d2
XL
637 let remaining_len = {
638 let mut remaining = &mut buffer[..];
639 write!(remaining, "{}", $value).unwrap();
640 remaining.len()
641 };
642 let written_len = buffer.len() - remaining_len;
643 let written = &buffer[..written_len];
644
645 // write! only provides fmt::Formatter to Display implementations, which
646 // has methods write_str and write_char but no method to write arbitrary
647 // bytes. Therefore `written` must be valid UTF-8.
f035d41b 648 let written_str = str::from_utf8(written).expect("must be valid UTF-8");
041b39d2 649 $serializer.serialize_str(written_str)
83c7162d 650 }};
041b39d2
XL
651}
652
653#[cfg(feature = "std")]
654impl Serialize for net::IpAddr {
655 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
656 where
657 S: Serializer,
658 {
abe05a73
XL
659 if serializer.is_human_readable() {
660 match *self {
661 net::IpAddr::V4(ref a) => a.serialize(serializer),
662 net::IpAddr::V6(ref a) => a.serialize(serializer),
663 }
664 } else {
665 match *self {
ff7c6d11
XL
666 net::IpAddr::V4(ref a) => {
667 serializer.serialize_newtype_variant("IpAddr", 0, "V4", a)
668 }
669 net::IpAddr::V6(ref a) => {
670 serializer.serialize_newtype_variant("IpAddr", 1, "V6", a)
671 }
abe05a73 672 }
041b39d2
XL
673 }
674 }
675}
676
cdc7bbd5
XL
677#[cfg(feature = "std")]
678const DEC_DIGITS_LUT: &'static [u8] = b"\
679 0001020304050607080910111213141516171819\
680 2021222324252627282930313233343536373839\
681 4041424344454647484950515253545556575859\
682 6061626364656667686970717273747576777879\
683 8081828384858687888990919293949596979899";
684
685#[cfg(feature = "std")]
686#[inline]
687fn format_u8(mut n: u8, out: &mut [u8]) -> usize {
688 if n >= 100 {
689 let d1 = ((n % 100) << 1) as usize;
690 n /= 100;
691 out[0] = b'0' + n;
692 out[1] = DEC_DIGITS_LUT[d1];
693 out[2] = DEC_DIGITS_LUT[d1 + 1];
694 3
695 } else if n >= 10 {
696 let d1 = (n << 1) as usize;
697 out[0] = DEC_DIGITS_LUT[d1];
698 out[1] = DEC_DIGITS_LUT[d1 + 1];
699 2
700 } else {
701 out[0] = b'0' + n;
702 1
703 }
704}
705
706#[cfg(feature = "std")]
707#[test]
708fn test_format_u8() {
709 let mut i = 0u8;
710
711 loop {
712 let mut buf = [0u8; 3];
713 let written = format_u8(i, &mut buf);
714 assert_eq!(i.to_string().as_bytes(), &buf[..written]);
715
716 match i.checked_add(1) {
717 Some(next) => i = next,
718 None => break,
719 }
720 }
721}
722
041b39d2
XL
723#[cfg(feature = "std")]
724impl Serialize for net::Ipv4Addr {
725 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
726 where
727 S: Serializer,
728 {
abe05a73
XL
729 if serializer.is_human_readable() {
730 const MAX_LEN: usize = 15;
731 debug_assert_eq!(MAX_LEN, "101.102.103.104".len());
cdc7bbd5
XL
732 let mut buf = [b'.'; MAX_LEN];
733 let mut written = format_u8(self.octets()[0], &mut buf);
734 for oct in &self.octets()[1..] {
735 // Skip over delimiters that we initialized buf with
736 written += format_u8(*oct, &mut buf[written + 1..]) + 1;
737 }
738 // We've only written ASCII bytes to the buffer, so it is valid UTF-8
739 serializer.serialize_str(unsafe { str::from_utf8_unchecked(&buf[..written]) })
abe05a73
XL
740 } else {
741 self.octets().serialize(serializer)
742 }
041b39d2
XL
743 }
744}
745
746#[cfg(feature = "std")]
747impl Serialize for net::Ipv6Addr {
748 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
749 where
750 S: Serializer,
751 {
abe05a73
XL
752 if serializer.is_human_readable() {
753 const MAX_LEN: usize = 39;
754 debug_assert_eq!(MAX_LEN, "1001:1002:1003:1004:1005:1006:1007:1008".len());
755 serialize_display_bounded_length!(self, MAX_LEN, serializer)
756 } else {
757 self.octets().serialize(serializer)
758 }
041b39d2
XL
759 }
760}
761
762#[cfg(feature = "std")]
763impl Serialize for net::SocketAddr {
764 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
765 where
766 S: Serializer,
767 {
abe05a73
XL
768 if serializer.is_human_readable() {
769 match *self {
770 net::SocketAddr::V4(ref addr) => addr.serialize(serializer),
771 net::SocketAddr::V6(ref addr) => addr.serialize(serializer),
772 }
773 } else {
774 match *self {
ff7c6d11
XL
775 net::SocketAddr::V4(ref addr) => {
776 serializer.serialize_newtype_variant("SocketAddr", 0, "V4", addr)
777 }
778 net::SocketAddr::V6(ref addr) => {
779 serializer.serialize_newtype_variant("SocketAddr", 1, "V6", addr)
780 }
abe05a73 781 }
041b39d2
XL
782 }
783 }
784}
785
786#[cfg(feature = "std")]
787impl Serialize for net::SocketAddrV4 {
788 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
789 where
790 S: Serializer,
791 {
abe05a73
XL
792 if serializer.is_human_readable() {
793 const MAX_LEN: usize = 21;
794 debug_assert_eq!(MAX_LEN, "101.102.103.104:65000".len());
795 serialize_display_bounded_length!(self, MAX_LEN, serializer)
796 } else {
797 (self.ip(), self.port()).serialize(serializer)
798 }
041b39d2
XL
799 }
800}
801
802#[cfg(feature = "std")]
803impl Serialize for net::SocketAddrV6 {
804 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
805 where
806 S: Serializer,
807 {
abe05a73 808 if serializer.is_human_readable() {
fc512014 809 const MAX_LEN: usize = 58;
ff7c6d11
XL
810 debug_assert_eq!(
811 MAX_LEN,
fc512014 812 "[1001:1002:1003:1004:1005:1006:1007:1008%4294967295]:65000".len()
ff7c6d11 813 );
abe05a73
XL
814 serialize_display_bounded_length!(self, MAX_LEN, serializer)
815 } else {
816 (self.ip(), self.port()).serialize(serializer)
817 }
041b39d2
XL
818 }
819}
820
821////////////////////////////////////////////////////////////////////////////////
822
823#[cfg(feature = "std")]
824impl Serialize for Path {
825 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
826 where
827 S: Serializer,
828 {
829 match self.to_str() {
830 Some(s) => s.serialize(serializer),
831 None => Err(Error::custom("path contains invalid UTF-8 characters")),
832 }
833 }
834}
835
836#[cfg(feature = "std")]
837impl Serialize for PathBuf {
838 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
839 where
840 S: Serializer,
841 {
842 self.as_path().serialize(serializer)
843 }
844}
845
846#[cfg(all(feature = "std", any(unix, windows)))]
847impl Serialize for OsStr {
848 #[cfg(unix)]
849 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
850 where
851 S: Serializer,
852 {
853 use std::os::unix::ffi::OsStrExt;
854 serializer.serialize_newtype_variant("OsString", 0, "Unix", self.as_bytes())
855 }
856
857 #[cfg(windows)]
858 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
859 where
860 S: Serializer,
861 {
862 use std::os::windows::ffi::OsStrExt;
863 let val = self.encode_wide().collect::<Vec<_>>();
864 serializer.serialize_newtype_variant("OsString", 1, "Windows", &val)
865 }
866}
867
868#[cfg(all(feature = "std", any(unix, windows)))]
869impl Serialize for OsString {
870 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
871 where
872 S: Serializer,
873 {
874 self.as_os_str().serialize(serializer)
875 }
876}
abe05a73
XL
877
878////////////////////////////////////////////////////////////////////////////////
879
abe05a73
XL
880impl<T> Serialize for Wrapping<T>
881where
882 T: Serialize,
883{
884 #[inline]
885 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
886 where
887 S: Serializer,
888 {
889 self.0.serialize(serializer)
890 }
891}
dc9dc135 892
5099ac24 893#[cfg(not(no_core_reverse))]
dc9dc135
XL
894impl<T> Serialize for Reverse<T>
895where
896 T: Serialize,
897{
898 #[inline]
899 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
900 where
901 S: Serializer,
902 {
903 self.0.serialize(serializer)
904 }
905}
e1599b0c
XL
906
907////////////////////////////////////////////////////////////////////////////////
908
5099ac24 909#[cfg(all(feature = "std", not(no_std_atomic)))]
e1599b0c
XL
910macro_rules! atomic_impl {
911 ($($ty:ident)*) => {
912 $(
913 impl Serialize for $ty {
914 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
915 where
916 S: Serializer,
917 {
5099ac24 918 // Matches the atomic ordering used in libcore for the Debug impl
e1599b0c
XL
919 self.load(Ordering::SeqCst).serialize(serializer)
920 }
921 }
922 )*
923 }
924}
925
5099ac24 926#[cfg(all(feature = "std", not(no_std_atomic)))]
e1599b0c
XL
927atomic_impl! {
928 AtomicBool
929 AtomicI8 AtomicI16 AtomicI32 AtomicIsize
930 AtomicU8 AtomicU16 AtomicU32 AtomicUsize
931}
932
5099ac24 933#[cfg(all(feature = "std", not(no_std_atomic64)))]
e1599b0c
XL
934atomic_impl! {
935 AtomicI64 AtomicU64
936}