]> git.proxmox.com Git - rustc.git/blame - vendor/serde/src/de/impls.rs
New upstream version 1.36.0+dfsg1
[rustc.git] / vendor / serde / src / de / impls.rs
CommitLineData
041b39d2
XL
1use lib::*;
2
8faf50e0
XL
3use de::{
4 Deserialize, Deserializer, EnumAccess, Error, SeqAccess, Unexpected, VariantAccess, Visitor,
5};
041b39d2 6
8faf50e0 7#[cfg(any(core_duration, feature = "std", feature = "alloc"))]
041b39d2
XL
8use de::MapAccess;
9
10use de::from_primitive::FromPrimitive;
ff7c6d11 11use private::de::InPlaceSeed;
041b39d2
XL
12
13#[cfg(any(feature = "std", feature = "alloc"))]
14use private::de::size_hint;
15
16////////////////////////////////////////////////////////////////////////////////
17
18struct UnitVisitor;
19
20impl<'de> Visitor<'de> for UnitVisitor {
21 type Value = ();
22
23 fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
24 formatter.write_str("unit")
25 }
26
8faf50e0 27 fn visit_unit<E>(self) -> Result<Self::Value, E>
041b39d2
XL
28 where
29 E: Error,
30 {
31 Ok(())
32 }
33}
34
35impl<'de> Deserialize<'de> for () {
8faf50e0 36 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
041b39d2
XL
37 where
38 D: Deserializer<'de>,
39 {
40 deserializer.deserialize_unit(UnitVisitor)
41 }
42}
43
8faf50e0
XL
44#[cfg(feature = "unstable")]
45impl<'de> Deserialize<'de> for ! {
46 fn deserialize<D>(_deserializer: D) -> Result<Self, D::Error>
47 where
48 D: Deserializer<'de>,
49 {
50 Err(Error::custom("cannot deserialize `!`"))
51 }
52}
53
041b39d2
XL
54////////////////////////////////////////////////////////////////////////////////
55
56struct BoolVisitor;
57
58impl<'de> Visitor<'de> for BoolVisitor {
59 type Value = bool;
60
61 fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
62 formatter.write_str("a boolean")
63 }
64
8faf50e0 65 fn visit_bool<E>(self, v: bool) -> Result<Self::Value, E>
041b39d2
XL
66 where
67 E: Error,
68 {
69 Ok(v)
70 }
71}
72
73impl<'de> Deserialize<'de> for bool {
8faf50e0 74 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
041b39d2
XL
75 where
76 D: Deserializer<'de>,
77 {
78 deserializer.deserialize_bool(BoolVisitor)
79 }
80}
81
82////////////////////////////////////////////////////////////////////////////////
83
84macro_rules! visit_integer_method {
85 ($src_ty:ident, $method:ident, $from_method:ident, $group:ident, $group_ty:ident) => {
86 #[inline]
87 fn $method<E>(self, v: $src_ty) -> Result<Self::Value, E>
88 where
89 E: Error,
90 {
91 match FromPrimitive::$from_method(v) {
92 Some(v) => Ok(v),
93 None => Err(Error::invalid_value(Unexpected::$group(v as $group_ty), &self)),
94 }
95 }
96 }
97}
98
99macro_rules! visit_float_method {
100 ($src_ty:ident, $method:ident) => {
101 #[inline]
102 fn $method<E>(self, v: $src_ty) -> Result<Self::Value, E>
103 where
104 E: Error,
105 {
106 Ok(v as Self::Value)
107 }
108 }
109}
110
111macro_rules! impl_deserialize_num {
112 ($ty:ident, $method:ident, $($visit:ident),*) => {
113 impl<'de> Deserialize<'de> for $ty {
114 #[inline]
8faf50e0 115 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
041b39d2
XL
116 where
117 D: Deserializer<'de>,
118 {
119 struct PrimitiveVisitor;
120
121 impl<'de> Visitor<'de> for PrimitiveVisitor {
122 type Value = $ty;
123
124 fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
125 formatter.write_str(stringify!($ty))
126 }
127
128 $(
129 impl_deserialize_num!($visit $ty);
130 )*
131 }
132
133 deserializer.$method(PrimitiveVisitor)
134 }
135 }
136 };
137
138 (integer $ty:ident) => {
139 visit_integer_method!(i8, visit_i8, from_i8, Signed, i64);
140 visit_integer_method!(i16, visit_i16, from_i16, Signed, i64);
141 visit_integer_method!(i32, visit_i32, from_i32, Signed, i64);
142 visit_integer_method!(i64, visit_i64, from_i64, Signed, i64);
143
144 visit_integer_method!(u8, visit_u8, from_u8, Unsigned, u64);
145 visit_integer_method!(u16, visit_u16, from_u16, Unsigned, u64);
146 visit_integer_method!(u32, visit_u32, from_u32, Unsigned, u64);
147 visit_integer_method!(u64, visit_u64, from_u64, Unsigned, u64);
148 };
149
150 (float $ty:ident) => {
151 visit_float_method!(f32, visit_f32);
152 visit_float_method!(f64, visit_f64);
153 };
154}
155
156impl_deserialize_num!(i8, deserialize_i8, integer);
157impl_deserialize_num!(i16, deserialize_i16, integer);
158impl_deserialize_num!(i32, deserialize_i32, integer);
159impl_deserialize_num!(i64, deserialize_i64, integer);
160impl_deserialize_num!(isize, deserialize_i64, integer);
161
162impl_deserialize_num!(u8, deserialize_u8, integer);
163impl_deserialize_num!(u16, deserialize_u16, integer);
164impl_deserialize_num!(u32, deserialize_u32, integer);
165impl_deserialize_num!(u64, deserialize_u64, integer);
166impl_deserialize_num!(usize, deserialize_u64, integer);
167
168impl_deserialize_num!(f32, deserialize_f32, integer, float);
169impl_deserialize_num!(f64, deserialize_f64, integer, float);
170
8faf50e0
XL
171serde_if_integer128! {
172 impl<'de> Deserialize<'de> for i128 {
173 #[inline]
174 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
175 where
176 D: Deserializer<'de>,
177 {
178 struct PrimitiveVisitor;
179
180 impl<'de> Visitor<'de> for PrimitiveVisitor {
181 type Value = i128;
182
183 fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
184 formatter.write_str("i128")
185 }
186
187 impl_deserialize_num!(integer i128);
188
189 #[inline]
190 fn visit_i128<E>(self, v: i128) -> Result<Self::Value, E>
191 where
192 E: Error,
193 {
194 Ok(v)
195 }
196
197 #[inline]
198 fn visit_u128<E>(self, v: u128) -> Result<Self::Value, E>
199 where
200 E: Error,
201 {
202 if v <= i128::max_value() as u128 {
203 Ok(v as i128)
204 } else {
205 Err(Error::invalid_value(Unexpected::Other("u128"), &self))
206 }
207 }
208 }
209
210 deserializer.deserialize_i128(PrimitiveVisitor)
211 }
212 }
213
214 impl<'de> Deserialize<'de> for u128 {
215 #[inline]
216 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
217 where
218 D: Deserializer<'de>,
219 {
220 struct PrimitiveVisitor;
221
222 impl<'de> Visitor<'de> for PrimitiveVisitor {
223 type Value = u128;
224
225 fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
226 formatter.write_str("u128")
227 }
228
229 impl_deserialize_num!(integer u128);
230
231 #[inline]
232 fn visit_i128<E>(self, v: i128) -> Result<Self::Value, E>
233 where
234 E: Error,
235 {
236 if v >= 0 {
237 Ok(v as u128)
238 } else {
239 Err(Error::invalid_value(Unexpected::Other("i128"), &self))
240 }
241 }
242
243 #[inline]
244 fn visit_u128<E>(self, v: u128) -> Result<Self::Value, E>
245 where
246 E: Error,
247 {
248 Ok(v)
249 }
250 }
251
252 deserializer.deserialize_u128(PrimitiveVisitor)
253 }
254 }
255}
256
041b39d2
XL
257////////////////////////////////////////////////////////////////////////////////
258
259struct CharVisitor;
260
261impl<'de> Visitor<'de> for CharVisitor {
262 type Value = char;
263
264 fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
265 formatter.write_str("a character")
266 }
267
268 #[inline]
8faf50e0 269 fn visit_char<E>(self, v: char) -> Result<Self::Value, E>
041b39d2
XL
270 where
271 E: Error,
272 {
273 Ok(v)
274 }
275
276 #[inline]
8faf50e0 277 fn visit_str<E>(self, v: &str) -> Result<Self::Value, E>
041b39d2
XL
278 where
279 E: Error,
280 {
281 let mut iter = v.chars();
282 match (iter.next(), iter.next()) {
283 (Some(c), None) => Ok(c),
284 _ => Err(Error::invalid_value(Unexpected::Str(v), &self)),
285 }
286 }
287}
288
289impl<'de> Deserialize<'de> for char {
290 #[inline]
8faf50e0 291 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
041b39d2
XL
292 where
293 D: Deserializer<'de>,
294 {
295 deserializer.deserialize_char(CharVisitor)
296 }
297}
298
299////////////////////////////////////////////////////////////////////////////////
300
301#[cfg(any(feature = "std", feature = "alloc"))]
302struct StringVisitor;
ff7c6d11
XL
303#[cfg(any(feature = "std", feature = "alloc"))]
304struct StringInPlaceVisitor<'a>(&'a mut String);
041b39d2
XL
305
306#[cfg(any(feature = "std", feature = "alloc"))]
307impl<'de> Visitor<'de> for StringVisitor {
308 type Value = String;
309
310 fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
311 formatter.write_str("a string")
312 }
313
8faf50e0 314 fn visit_str<E>(self, v: &str) -> Result<Self::Value, E>
041b39d2
XL
315 where
316 E: Error,
317 {
318 Ok(v.to_owned())
319 }
320
8faf50e0 321 fn visit_string<E>(self, v: String) -> Result<Self::Value, E>
041b39d2
XL
322 where
323 E: Error,
324 {
325 Ok(v)
326 }
327
8faf50e0 328 fn visit_bytes<E>(self, v: &[u8]) -> Result<Self::Value, E>
041b39d2
XL
329 where
330 E: Error,
331 {
332 match str::from_utf8(v) {
333 Ok(s) => Ok(s.to_owned()),
334 Err(_) => Err(Error::invalid_value(Unexpected::Bytes(v), &self)),
335 }
336 }
337
8faf50e0 338 fn visit_byte_buf<E>(self, v: Vec<u8>) -> Result<Self::Value, E>
041b39d2
XL
339 where
340 E: Error,
341 {
342 match String::from_utf8(v) {
343 Ok(s) => Ok(s),
ff7c6d11
XL
344 Err(e) => Err(Error::invalid_value(
345 Unexpected::Bytes(&e.into_bytes()),
346 &self,
347 )),
348 }
349 }
350}
351
352#[cfg(any(feature = "std", feature = "alloc"))]
353impl<'a, 'de> Visitor<'de> for StringInPlaceVisitor<'a> {
354 type Value = ();
355
356 fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
357 formatter.write_str("a string")
358 }
359
8faf50e0 360 fn visit_str<E>(self, v: &str) -> Result<Self::Value, E>
ff7c6d11
XL
361 where
362 E: Error,
363 {
364 self.0.clear();
365 self.0.push_str(v);
366 Ok(())
367 }
368
8faf50e0 369 fn visit_string<E>(self, v: String) -> Result<Self::Value, E>
ff7c6d11
XL
370 where
371 E: Error,
372 {
373 *self.0 = v;
374 Ok(())
375 }
376
8faf50e0 377 fn visit_bytes<E>(self, v: &[u8]) -> Result<Self::Value, E>
ff7c6d11
XL
378 where
379 E: Error,
380 {
381 match str::from_utf8(v) {
382 Ok(s) => {
383 self.0.clear();
384 self.0.push_str(s);
385 Ok(())
386 }
387 Err(_) => Err(Error::invalid_value(Unexpected::Bytes(v), &self)),
388 }
389 }
390
8faf50e0 391 fn visit_byte_buf<E>(self, v: Vec<u8>) -> Result<Self::Value, E>
ff7c6d11
XL
392 where
393 E: Error,
394 {
395 match String::from_utf8(v) {
396 Ok(s) => {
397 *self.0 = s;
398 Ok(())
399 }
400 Err(e) => Err(Error::invalid_value(
401 Unexpected::Bytes(&e.into_bytes()),
402 &self,
403 )),
041b39d2
XL
404 }
405 }
406}
407
408#[cfg(any(feature = "std", feature = "alloc"))]
409impl<'de> Deserialize<'de> for String {
8faf50e0 410 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
041b39d2
XL
411 where
412 D: Deserializer<'de>,
413 {
414 deserializer.deserialize_string(StringVisitor)
415 }
ff7c6d11
XL
416
417 fn deserialize_in_place<D>(deserializer: D, place: &mut Self) -> Result<(), D::Error>
418 where
419 D: Deserializer<'de>,
420 {
421 deserializer.deserialize_string(StringInPlaceVisitor(place))
422 }
041b39d2
XL
423}
424
425////////////////////////////////////////////////////////////////////////////////
426
427struct StrVisitor;
428
429impl<'a> Visitor<'a> for StrVisitor {
430 type Value = &'a str;
431
432 fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
433 formatter.write_str("a borrowed string")
434 }
435
436 fn visit_borrowed_str<E>(self, v: &'a str) -> Result<Self::Value, E>
437 where
438 E: Error,
439 {
440 Ok(v) // so easy
441 }
442
443 fn visit_borrowed_bytes<E>(self, v: &'a [u8]) -> Result<Self::Value, E>
444 where
445 E: Error,
446 {
447 str::from_utf8(v).map_err(|_| Error::invalid_value(Unexpected::Bytes(v), &self))
448 }
449}
450
451impl<'de: 'a, 'a> Deserialize<'de> for &'a str {
452 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
453 where
454 D: Deserializer<'de>,
455 {
456 deserializer.deserialize_str(StrVisitor)
457 }
458}
459
460////////////////////////////////////////////////////////////////////////////////
461
462struct BytesVisitor;
463
464impl<'a> Visitor<'a> for BytesVisitor {
465 type Value = &'a [u8];
466
467 fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
468 formatter.write_str("a borrowed byte array")
469 }
470
471 fn visit_borrowed_bytes<E>(self, v: &'a [u8]) -> Result<Self::Value, E>
472 where
473 E: Error,
474 {
475 Ok(v)
476 }
477
478 fn visit_borrowed_str<E>(self, v: &'a str) -> Result<Self::Value, E>
479 where
480 E: Error,
481 {
482 Ok(v.as_bytes())
483 }
484}
485
486impl<'de: 'a, 'a> Deserialize<'de> for &'a [u8] {
487 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
488 where
489 D: Deserializer<'de>,
490 {
491 deserializer.deserialize_bytes(BytesVisitor)
492 }
493}
494
495////////////////////////////////////////////////////////////////////////////////
496
497#[cfg(feature = "std")]
498struct CStringVisitor;
499
500#[cfg(feature = "std")]
501impl<'de> Visitor<'de> for CStringVisitor {
502 type Value = CString;
503
504 fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
505 formatter.write_str("byte array")
506 }
507
8faf50e0 508 fn visit_seq<A>(self, mut seq: A) -> Result<Self::Value, A::Error>
041b39d2
XL
509 where
510 A: SeqAccess<'de>,
511 {
512 let len = size_hint::cautious(seq.size_hint());
513 let mut values = Vec::with_capacity(len);
514
515 while let Some(value) = try!(seq.next_element()) {
516 values.push(value);
517 }
518
519 CString::new(values).map_err(Error::custom)
520 }
521
8faf50e0 522 fn visit_bytes<E>(self, v: &[u8]) -> Result<Self::Value, E>
041b39d2
XL
523 where
524 E: Error,
525 {
526 CString::new(v).map_err(Error::custom)
527 }
528
8faf50e0 529 fn visit_byte_buf<E>(self, v: Vec<u8>) -> Result<Self::Value, E>
041b39d2
XL
530 where
531 E: Error,
532 {
533 CString::new(v).map_err(Error::custom)
534 }
535
8faf50e0 536 fn visit_str<E>(self, v: &str) -> Result<Self::Value, E>
041b39d2
XL
537 where
538 E: Error,
539 {
540 CString::new(v).map_err(Error::custom)
541 }
542
8faf50e0 543 fn visit_string<E>(self, v: String) -> Result<Self::Value, E>
041b39d2
XL
544 where
545 E: Error,
546 {
547 CString::new(v).map_err(Error::custom)
548 }
549}
550
551#[cfg(feature = "std")]
552impl<'de> Deserialize<'de> for CString {
8faf50e0 553 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
041b39d2
XL
554 where
555 D: Deserializer<'de>,
556 {
557 deserializer.deserialize_byte_buf(CStringVisitor)
558 }
559}
560
3b2f2976 561macro_rules! forwarded_impl {
83c7162d
XL
562 (
563 $(#[doc = $doc:tt])*
564 ( $($id: ident),* ), $ty: ty, $func: expr
565 ) => {
566 $(#[doc = $doc])*
3b2f2976
XL
567 impl<'de $(, $id : Deserialize<'de>,)*> Deserialize<'de> for $ty {
568 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
569 where
570 D: Deserializer<'de>,
571 {
572 Deserialize::deserialize(deserializer).map($func)
573 }
574 }
041b39d2
XL
575 }
576}
577
8faf50e0 578#[cfg(all(feature = "std", de_boxed_c_str))]
3b2f2976
XL
579forwarded_impl!((), Box<CStr>, CString::into_boxed_c_str);
580
041b39d2
XL
581////////////////////////////////////////////////////////////////////////////////
582
583struct OptionVisitor<T> {
584 marker: PhantomData<T>,
585}
586
587impl<'de, T> Visitor<'de> for OptionVisitor<T>
588where
589 T: Deserialize<'de>,
590{
591 type Value = Option<T>;
592
593 fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
594 formatter.write_str("option")
595 }
596
597 #[inline]
8faf50e0 598 fn visit_unit<E>(self) -> Result<Self::Value, E>
041b39d2
XL
599 where
600 E: Error,
601 {
602 Ok(None)
603 }
604
605 #[inline]
8faf50e0 606 fn visit_none<E>(self) -> Result<Self::Value, E>
041b39d2
XL
607 where
608 E: Error,
609 {
610 Ok(None)
611 }
612
613 #[inline]
8faf50e0 614 fn visit_some<D>(self, deserializer: D) -> Result<Self::Value, D::Error>
041b39d2
XL
615 where
616 D: Deserializer<'de>,
617 {
618 T::deserialize(deserializer).map(Some)
619 }
8faf50e0
XL
620
621 #[doc(hidden)]
622 fn __private_visit_untagged_option<D>(self, deserializer: D) -> Result<Self::Value, ()>
623 where
624 D: Deserializer<'de>,
625 {
626 Ok(T::deserialize(deserializer).ok())
627 }
041b39d2
XL
628}
629
630impl<'de, T> Deserialize<'de> for Option<T>
631where
632 T: Deserialize<'de>,
633{
8faf50e0 634 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
041b39d2
XL
635 where
636 D: Deserializer<'de>,
637 {
ff7c6d11
XL
638 deserializer.deserialize_option(OptionVisitor {
639 marker: PhantomData,
640 })
041b39d2 641 }
ff7c6d11
XL
642
643 // The Some variant's repr is opaque, so we can't play cute tricks with its
644 // tag to have deserialize_in_place build the content in place unconditionally.
645 //
646 // FIXME: investigate whether branching on the old value being Some to
647 // deserialize_in_place the value is profitable (probably data-dependent?)
041b39d2
XL
648}
649
650////////////////////////////////////////////////////////////////////////////////
651
2c00a5a8 652struct PhantomDataVisitor<T: ?Sized> {
041b39d2
XL
653 marker: PhantomData<T>,
654}
655
2c00a5a8 656impl<'de, T: ?Sized> Visitor<'de> for PhantomDataVisitor<T> {
041b39d2
XL
657 type Value = PhantomData<T>;
658
659 fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
660 formatter.write_str("unit")
661 }
662
663 #[inline]
8faf50e0 664 fn visit_unit<E>(self) -> Result<Self::Value, E>
041b39d2
XL
665 where
666 E: Error,
667 {
668 Ok(PhantomData)
669 }
670}
671
2c00a5a8 672impl<'de, T: ?Sized> Deserialize<'de> for PhantomData<T> {
8faf50e0 673 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
041b39d2
XL
674 where
675 D: Deserializer<'de>,
676 {
ff7c6d11
XL
677 let visitor = PhantomDataVisitor {
678 marker: PhantomData,
679 };
041b39d2
XL
680 deserializer.deserialize_unit_struct("PhantomData", visitor)
681 }
682}
683
684////////////////////////////////////////////////////////////////////////////////
685
686#[cfg(any(feature = "std", feature = "alloc"))]
687macro_rules! seq_impl {
688 (
689 $ty:ident < T $(: $tbound1:ident $(+ $tbound2:ident)*)* $(, $typaram:ident : $bound1:ident $(+ $bound2:ident)*)* >,
690 $access:ident,
ff7c6d11 691 $clear:expr,
041b39d2 692 $with_capacity:expr,
ff7c6d11 693 $reserve:expr,
041b39d2
XL
694 $insert:expr
695 ) => {
696 impl<'de, T $(, $typaram)*> Deserialize<'de> for $ty<T $(, $typaram)*>
697 where
698 T: Deserialize<'de> $(+ $tbound1 $(+ $tbound2)*)*,
699 $($typaram: $bound1 $(+ $bound2)*,)*
700 {
701 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
702 where
703 D: Deserializer<'de>,
704 {
705 struct SeqVisitor<T $(, $typaram)*> {
706 marker: PhantomData<$ty<T $(, $typaram)*>>,
707 }
708
709 impl<'de, T $(, $typaram)*> Visitor<'de> for SeqVisitor<T $(, $typaram)*>
710 where
711 T: Deserialize<'de> $(+ $tbound1 $(+ $tbound2)*)*,
712 $($typaram: $bound1 $(+ $bound2)*,)*
713 {
714 type Value = $ty<T $(, $typaram)*>;
715
716 fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
717 formatter.write_str("a sequence")
718 }
719
720 #[inline]
721 fn visit_seq<A>(self, mut $access: A) -> Result<Self::Value, A::Error>
722 where
723 A: SeqAccess<'de>,
724 {
725 let mut values = $with_capacity;
726
727 while let Some(value) = try!($access.next_element()) {
728 $insert(&mut values, value);
729 }
730
731 Ok(values)
732 }
733 }
734
735 let visitor = SeqVisitor { marker: PhantomData };
736 deserializer.deserialize_seq(visitor)
737 }
ff7c6d11
XL
738
739 fn deserialize_in_place<D>(deserializer: D, place: &mut Self) -> Result<(), D::Error>
740 where
741 D: Deserializer<'de>,
742 {
743 struct SeqInPlaceVisitor<'a, T: 'a $(, $typaram: 'a)*>(&'a mut $ty<T $(, $typaram)*>);
744
745 impl<'a, 'de, T $(, $typaram)*> Visitor<'de> for SeqInPlaceVisitor<'a, T $(, $typaram)*>
746 where
747 T: Deserialize<'de> $(+ $tbound1 $(+ $tbound2)*)*,
748 $($typaram: $bound1 $(+ $bound2)*,)*
749 {
750 type Value = ();
751
752 fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
753 formatter.write_str("a sequence")
754 }
755
756 #[inline]
8faf50e0 757 fn visit_seq<A>(mut self, mut $access: A) -> Result<Self::Value, A::Error>
ff7c6d11
XL
758 where
759 A: SeqAccess<'de>,
760 {
761 $clear(&mut self.0);
762 $reserve(&mut self.0, size_hint::cautious($access.size_hint()));
763
764 // FIXME: try to overwrite old values here? (Vec, VecDeque, LinkedList)
765 while let Some(value) = try!($access.next_element()) {
766 $insert(&mut self.0, value);
767 }
768
769 Ok(())
770 }
771 }
772
773 deserializer.deserialize_seq(SeqInPlaceVisitor(place))
774 }
041b39d2
XL
775 }
776 }
777}
778
ff7c6d11
XL
779// Dummy impl of reserve
780#[cfg(any(feature = "std", feature = "alloc"))]
781fn nop_reserve<T>(_seq: T, _n: usize) {}
782
041b39d2
XL
783#[cfg(any(feature = "std", feature = "alloc"))]
784seq_impl!(
785 BinaryHeap<T: Ord>,
786 seq,
ff7c6d11 787 BinaryHeap::clear,
041b39d2 788 BinaryHeap::with_capacity(size_hint::cautious(seq.size_hint())),
ff7c6d11 789 BinaryHeap::reserve,
041b39d2
XL
790 BinaryHeap::push);
791
792#[cfg(any(feature = "std", feature = "alloc"))]
793seq_impl!(
794 BTreeSet<T: Eq + Ord>,
795 seq,
ff7c6d11 796 BTreeSet::clear,
041b39d2 797 BTreeSet::new(),
ff7c6d11 798 nop_reserve,
041b39d2
XL
799 BTreeSet::insert);
800
801#[cfg(any(feature = "std", feature = "alloc"))]
802seq_impl!(
803 LinkedList<T>,
804 seq,
ff7c6d11 805 LinkedList::clear,
041b39d2 806 LinkedList::new(),
ff7c6d11
XL
807 nop_reserve,
808 LinkedList::push_back
809);
041b39d2
XL
810
811#[cfg(feature = "std")]
812seq_impl!(
813 HashSet<T: Eq + Hash, S: BuildHasher + Default>,
814 seq,
ff7c6d11 815 HashSet::clear,
041b39d2 816 HashSet::with_capacity_and_hasher(size_hint::cautious(seq.size_hint()), S::default()),
ff7c6d11 817 HashSet::reserve,
041b39d2
XL
818 HashSet::insert);
819
041b39d2
XL
820#[cfg(any(feature = "std", feature = "alloc"))]
821seq_impl!(
822 VecDeque<T>,
823 seq,
ff7c6d11 824 VecDeque::clear,
041b39d2 825 VecDeque::with_capacity(size_hint::cautious(seq.size_hint())),
ff7c6d11
XL
826 VecDeque::reserve,
827 VecDeque::push_back
828);
041b39d2
XL
829
830////////////////////////////////////////////////////////////////////////////////
831
0731742a
XL
832#[cfg(any(feature = "std", feature = "alloc"))]
833impl<'de, T> Deserialize<'de> for Vec<T>
834where
835 T: Deserialize<'de>,
836{
837 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
838 where
839 D: Deserializer<'de>,
840 {
841 struct VecVisitor<T> {
842 marker: PhantomData<T>,
843 }
844
845 impl<'de, T> Visitor<'de> for VecVisitor<T>
846 where
847 T: Deserialize<'de>,
848 {
849 type Value = Vec<T>;
850
851 fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
852 formatter.write_str("a sequence")
853 }
854
855 fn visit_seq<A>(self, mut seq: A) -> Result<Self::Value, A::Error>
856 where
857 A: SeqAccess<'de>,
858 {
859 let mut values = Vec::with_capacity(size_hint::cautious(seq.size_hint()));
860
861 while let Some(value) = try!(seq.next_element()) {
862 values.push(value);
863 }
864
865 Ok(values)
866 }
867 }
868
869 let visitor = VecVisitor {
870 marker: PhantomData,
871 };
872 deserializer.deserialize_seq(visitor)
873 }
874
875 fn deserialize_in_place<D>(deserializer: D, place: &mut Self) -> Result<(), D::Error>
876 where
877 D: Deserializer<'de>,
878 {
879 struct VecInPlaceVisitor<'a, T: 'a>(&'a mut Vec<T>);
880
881 impl<'a, 'de, T> Visitor<'de> for VecInPlaceVisitor<'a, T>
882 where
883 T: Deserialize<'de>,
884 {
885 type Value = ();
886
887 fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
888 formatter.write_str("a sequence")
889 }
890
891 fn visit_seq<A>(self, mut seq: A) -> Result<Self::Value, A::Error>
892 where
893 A: SeqAccess<'de>,
894 {
895 let hint = size_hint::cautious(seq.size_hint());
896 if let Some(additional) = hint.checked_sub(self.0.len()) {
897 self.0.reserve(additional);
898 }
899
900 for i in 0..self.0.len() {
901 let next = {
902 let next_place = InPlaceSeed(&mut self.0[i]);
903 try!(seq.next_element_seed(next_place))
904 };
905 if next.is_none() {
906 self.0.truncate(i);
907 return Ok(());
908 }
909 }
910
911 while let Some(value) = try!(seq.next_element()) {
912 self.0.push(value);
913 }
914
915 Ok(())
916 }
917 }
918
919 deserializer.deserialize_seq(VecInPlaceVisitor(place))
920 }
921}
922
923////////////////////////////////////////////////////////////////////////////////
924
041b39d2
XL
925struct ArrayVisitor<A> {
926 marker: PhantomData<A>,
927}
ff7c6d11 928struct ArrayInPlaceVisitor<'a, A: 'a>(&'a mut A);
041b39d2
XL
929
930impl<A> ArrayVisitor<A> {
931 fn new() -> Self {
ff7c6d11
XL
932 ArrayVisitor {
933 marker: PhantomData,
934 }
041b39d2
XL
935 }
936}
937
938impl<'de, T> Visitor<'de> for ArrayVisitor<[T; 0]> {
939 type Value = [T; 0];
940
941 fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
942 formatter.write_str("an empty array")
943 }
944
945 #[inline]
8faf50e0 946 fn visit_seq<A>(self, _: A) -> Result<Self::Value, A::Error>
041b39d2
XL
947 where
948 A: SeqAccess<'de>,
949 {
950 Ok([])
951 }
952}
953
954// Does not require T: Deserialize<'de>.
955impl<'de, T> Deserialize<'de> for [T; 0] {
8faf50e0 956 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
041b39d2
XL
957 where
958 D: Deserializer<'de>,
959 {
960 deserializer.deserialize_tuple(0, ArrayVisitor::<[T; 0]>::new())
961 }
962}
963
964macro_rules! array_impls {
965 ($($len:expr => ($($n:tt $name:ident)+))+) => {
966 $(
967 impl<'de, T> Visitor<'de> for ArrayVisitor<[T; $len]>
968 where
969 T: Deserialize<'de>,
970 {
971 type Value = [T; $len];
972
973 fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
974 formatter.write_str(concat!("an array of length ", $len))
975 }
976
977 #[inline]
8faf50e0 978 fn visit_seq<A>(self, mut seq: A) -> Result<Self::Value, A::Error>
041b39d2
XL
979 where
980 A: SeqAccess<'de>,
981 {
982 $(
983 let $name = match try!(seq.next_element()) {
984 Some(val) => val,
985 None => return Err(Error::invalid_length($n, &self)),
986 };
987 )+
988
989 Ok([$($name),+])
990 }
991 }
992
ff7c6d11
XL
993 impl<'a, 'de, T> Visitor<'de> for ArrayInPlaceVisitor<'a, [T; $len]>
994 where
995 T: Deserialize<'de>,
996 {
997 type Value = ();
998
999 fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
1000 formatter.write_str(concat!("an array of length ", $len))
1001 }
1002
1003 #[inline]
8faf50e0 1004 fn visit_seq<A>(self, mut seq: A) -> Result<Self::Value, A::Error>
ff7c6d11
XL
1005 where
1006 A: SeqAccess<'de>,
1007 {
1008 let mut fail_idx = None;
1009 for (idx, dest) in self.0[..].iter_mut().enumerate() {
1010 if try!(seq.next_element_seed(InPlaceSeed(dest))).is_none() {
1011 fail_idx = Some(idx);
1012 break;
1013 }
1014 }
1015 if let Some(idx) = fail_idx {
1016 return Err(Error::invalid_length(idx, &self));
1017 }
1018 Ok(())
1019 }
1020 }
1021
041b39d2
XL
1022 impl<'de, T> Deserialize<'de> for [T; $len]
1023 where
1024 T: Deserialize<'de>,
1025 {
8faf50e0 1026 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
041b39d2
XL
1027 where
1028 D: Deserializer<'de>,
1029 {
1030 deserializer.deserialize_tuple($len, ArrayVisitor::<[T; $len]>::new())
1031 }
ff7c6d11
XL
1032
1033 fn deserialize_in_place<D>(deserializer: D, place: &mut Self) -> Result<(), D::Error>
1034 where
1035 D: Deserializer<'de>,
1036 {
1037 deserializer.deserialize_tuple($len, ArrayInPlaceVisitor(place))
1038 }
041b39d2
XL
1039 }
1040 )+
1041 }
1042}
1043
1044array_impls! {
1045 1 => (0 a)
1046 2 => (0 a 1 b)
1047 3 => (0 a 1 b 2 c)
1048 4 => (0 a 1 b 2 c 3 d)
1049 5 => (0 a 1 b 2 c 3 d 4 e)
1050 6 => (0 a 1 b 2 c 3 d 4 e 5 f)
1051 7 => (0 a 1 b 2 c 3 d 4 e 5 f 6 g)
1052 8 => (0 a 1 b 2 c 3 d 4 e 5 f 6 g 7 h)
1053 9 => (0 a 1 b 2 c 3 d 4 e 5 f 6 g 7 h 8 i)
1054 10 => (0 a 1 b 2 c 3 d 4 e 5 f 6 g 7 h 8 i 9 j)
1055 11 => (0 a 1 b 2 c 3 d 4 e 5 f 6 g 7 h 8 i 9 j 10 k)
1056 12 => (0 a 1 b 2 c 3 d 4 e 5 f 6 g 7 h 8 i 9 j 10 k 11 l)
1057 13 => (0 a 1 b 2 c 3 d 4 e 5 f 6 g 7 h 8 i 9 j 10 k 11 l 12 m)
1058 14 => (0 a 1 b 2 c 3 d 4 e 5 f 6 g 7 h 8 i 9 j 10 k 11 l 12 m 13 n)
1059 15 => (0 a 1 b 2 c 3 d 4 e 5 f 6 g 7 h 8 i 9 j 10 k 11 l 12 m 13 n 14 o)
1060 16 => (0 a 1 b 2 c 3 d 4 e 5 f 6 g 7 h 8 i 9 j 10 k 11 l 12 m 13 n 14 o 15 p)
1061 17 => (0 a 1 b 2 c 3 d 4 e 5 f 6 g 7 h 8 i 9 j 10 k 11 l 12 m 13 n 14 o 15 p 16 q)
1062 18 => (0 a 1 b 2 c 3 d 4 e 5 f 6 g 7 h 8 i 9 j 10 k 11 l 12 m 13 n 14 o 15 p 16 q 17 r)
1063 19 => (0 a 1 b 2 c 3 d 4 e 5 f 6 g 7 h 8 i 9 j 10 k 11 l 12 m 13 n 14 o 15 p 16 q 17 r 18 s)
1064 20 => (0 a 1 b 2 c 3 d 4 e 5 f 6 g 7 h 8 i 9 j 10 k 11 l 12 m 13 n 14 o 15 p 16 q 17 r 18 s 19 t)
1065 21 => (0 a 1 b 2 c 3 d 4 e 5 f 6 g 7 h 8 i 9 j 10 k 11 l 12 m 13 n 14 o 15 p 16 q 17 r 18 s 19 t 20 u)
1066 22 => (0 a 1 b 2 c 3 d 4 e 5 f 6 g 7 h 8 i 9 j 10 k 11 l 12 m 13 n 14 o 15 p 16 q 17 r 18 s 19 t 20 u 21 v)
1067 23 => (0 a 1 b 2 c 3 d 4 e 5 f 6 g 7 h 8 i 9 j 10 k 11 l 12 m 13 n 14 o 15 p 16 q 17 r 18 s 19 t 20 u 21 v 22 w)
1068 24 => (0 a 1 b 2 c 3 d 4 e 5 f 6 g 7 h 8 i 9 j 10 k 11 l 12 m 13 n 14 o 15 p 16 q 17 r 18 s 19 t 20 u 21 v 22 w 23 x)
1069 25 => (0 a 1 b 2 c 3 d 4 e 5 f 6 g 7 h 8 i 9 j 10 k 11 l 12 m 13 n 14 o 15 p 16 q 17 r 18 s 19 t 20 u 21 v 22 w 23 x 24 y)
1070 26 => (0 a 1 b 2 c 3 d 4 e 5 f 6 g 7 h 8 i 9 j 10 k 11 l 12 m 13 n 14 o 15 p 16 q 17 r 18 s 19 t 20 u 21 v 22 w 23 x 24 y 25 z)
1071 27 => (0 a 1 b 2 c 3 d 4 e 5 f 6 g 7 h 8 i 9 j 10 k 11 l 12 m 13 n 14 o 15 p 16 q 17 r 18 s 19 t 20 u 21 v 22 w 23 x 24 y 25 z 26 aa)
1072 28 => (0 a 1 b 2 c 3 d 4 e 5 f 6 g 7 h 8 i 9 j 10 k 11 l 12 m 13 n 14 o 15 p 16 q 17 r 18 s 19 t 20 u 21 v 22 w 23 x 24 y 25 z 26 aa 27 ab)
1073 29 => (0 a 1 b 2 c 3 d 4 e 5 f 6 g 7 h 8 i 9 j 10 k 11 l 12 m 13 n 14 o 15 p 16 q 17 r 18 s 19 t 20 u 21 v 22 w 23 x 24 y 25 z 26 aa 27 ab 28 ac)
1074 30 => (0 a 1 b 2 c 3 d 4 e 5 f 6 g 7 h 8 i 9 j 10 k 11 l 12 m 13 n 14 o 15 p 16 q 17 r 18 s 19 t 20 u 21 v 22 w 23 x 24 y 25 z 26 aa 27 ab 28 ac 29 ad)
1075 31 => (0 a 1 b 2 c 3 d 4 e 5 f 6 g 7 h 8 i 9 j 10 k 11 l 12 m 13 n 14 o 15 p 16 q 17 r 18 s 19 t 20 u 21 v 22 w 23 x 24 y 25 z 26 aa 27 ab 28 ac 29 ad 30 ae)
1076 32 => (0 a 1 b 2 c 3 d 4 e 5 f 6 g 7 h 8 i 9 j 10 k 11 l 12 m 13 n 14 o 15 p 16 q 17 r 18 s 19 t 20 u 21 v 22 w 23 x 24 y 25 z 26 aa 27 ab 28 ac 29 ad 30 ae 31 af)
1077}
1078
1079////////////////////////////////////////////////////////////////////////////////
1080
1081macro_rules! tuple_impls {
ff7c6d11 1082 ($($len:tt => ($($n:tt $name:ident)+))+) => {
041b39d2 1083 $(
ff7c6d11
XL
1084 impl<'de, $($name: Deserialize<'de>),+> Deserialize<'de> for ($($name,)+) {
1085 #[inline]
8faf50e0 1086 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
ff7c6d11
XL
1087 where
1088 D: Deserializer<'de>,
1089 {
1090 struct TupleVisitor<$($name,)+> {
1091 marker: PhantomData<($($name,)+)>,
1092 }
041b39d2 1093
ff7c6d11
XL
1094 impl<'de, $($name: Deserialize<'de>),+> Visitor<'de> for TupleVisitor<$($name,)+> {
1095 type Value = ($($name,)+);
041b39d2 1096
ff7c6d11
XL
1097 fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
1098 formatter.write_str(concat!("a tuple of size ", $len))
1099 }
041b39d2 1100
ff7c6d11
XL
1101 #[inline]
1102 #[allow(non_snake_case)]
8faf50e0 1103 fn visit_seq<A>(self, mut seq: A) -> Result<Self::Value, A::Error>
ff7c6d11
XL
1104 where
1105 A: SeqAccess<'de>,
1106 {
1107 $(
1108 let $name = match try!(seq.next_element()) {
1109 Some(value) => value,
1110 None => return Err(Error::invalid_length($n, &self)),
1111 };
1112 )+
041b39d2 1113
ff7c6d11
XL
1114 Ok(($($name,)+))
1115 }
1116 }
041b39d2 1117
ff7c6d11 1118 deserializer.deserialize_tuple($len, TupleVisitor { marker: PhantomData })
041b39d2 1119 }
041b39d2 1120
041b39d2 1121 #[inline]
ff7c6d11 1122 fn deserialize_in_place<D>(deserializer: D, place: &mut Self) -> Result<(), D::Error>
041b39d2
XL
1123 where
1124 D: Deserializer<'de>,
1125 {
ff7c6d11
XL
1126 struct TupleInPlaceVisitor<'a, $($name: 'a,)+>(&'a mut ($($name,)+));
1127
1128 impl<'a, 'de, $($name: Deserialize<'de>),+> Visitor<'de> for TupleInPlaceVisitor<'a, $($name,)+> {
1129 type Value = ();
1130
1131 fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
1132 formatter.write_str(concat!("a tuple of size ", $len))
1133 }
1134
1135 #[inline]
1136 #[allow(non_snake_case)]
8faf50e0 1137 fn visit_seq<A>(self, mut seq: A) -> Result<Self::Value, A::Error>
ff7c6d11
XL
1138 where
1139 A: SeqAccess<'de>,
1140 {
1141 $(
1142 if try!(seq.next_element_seed(InPlaceSeed(&mut (self.0).$n))).is_none() {
1143 return Err(Error::invalid_length($n, &self));
1144 }
1145 )+
1146
1147 Ok(())
1148 }
1149 }
1150
1151 deserializer.deserialize_tuple($len, TupleInPlaceVisitor(place))
041b39d2
XL
1152 }
1153 }
1154 )+
1155 }
1156}
1157
1158tuple_impls! {
ff7c6d11
XL
1159 1 => (0 T0)
1160 2 => (0 T0 1 T1)
1161 3 => (0 T0 1 T1 2 T2)
1162 4 => (0 T0 1 T1 2 T2 3 T3)
1163 5 => (0 T0 1 T1 2 T2 3 T3 4 T4)
1164 6 => (0 T0 1 T1 2 T2 3 T3 4 T4 5 T5)
1165 7 => (0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6)
1166 8 => (0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7)
1167 9 => (0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 8 T8)
1168 10 => (0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 8 T8 9 T9)
1169 11 => (0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 8 T8 9 T9 10 T10)
1170 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)
1171 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)
1172 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)
1173 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)
1174 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)
041b39d2
XL
1175}
1176
1177////////////////////////////////////////////////////////////////////////////////
1178
1179#[cfg(any(feature = "std", feature = "alloc"))]
1180macro_rules! map_impl {
1181 (
1182 $ty:ident < K $(: $kbound1:ident $(+ $kbound2:ident)*)*, V $(, $typaram:ident : $bound1:ident $(+ $bound2:ident)*)* >,
1183 $access:ident,
041b39d2
XL
1184 $with_capacity:expr
1185 ) => {
1186 impl<'de, K, V $(, $typaram)*> Deserialize<'de> for $ty<K, V $(, $typaram)*>
1187 where
1188 K: Deserialize<'de> $(+ $kbound1 $(+ $kbound2)*)*,
1189 V: Deserialize<'de>,
1190 $($typaram: $bound1 $(+ $bound2)*),*
1191 {
1192 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
1193 where
1194 D: Deserializer<'de>,
1195 {
1196 struct MapVisitor<K, V $(, $typaram)*> {
1197 marker: PhantomData<$ty<K, V $(, $typaram)*>>,
1198 }
1199
1200 impl<'de, K, V $(, $typaram)*> Visitor<'de> for MapVisitor<K, V $(, $typaram)*>
1201 where
1202 K: Deserialize<'de> $(+ $kbound1 $(+ $kbound2)*)*,
1203 V: Deserialize<'de>,
1204 $($typaram: $bound1 $(+ $bound2)*),*
1205 {
1206 type Value = $ty<K, V $(, $typaram)*>;
1207
1208 fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
1209 formatter.write_str("a map")
1210 }
1211
1212 #[inline]
1213 fn visit_map<A>(self, mut $access: A) -> Result<Self::Value, A::Error>
1214 where
1215 A: MapAccess<'de>,
1216 {
1217 let mut values = $with_capacity;
1218
1219 while let Some((key, value)) = try!($access.next_entry()) {
1220 values.insert(key, value);
1221 }
1222
1223 Ok(values)
1224 }
1225 }
1226
1227 let visitor = MapVisitor { marker: PhantomData };
1228 deserializer.deserialize_map(visitor)
1229 }
1230 }
1231 }
1232}
1233
1234#[cfg(any(feature = "std", feature = "alloc"))]
1235map_impl!(
1236 BTreeMap<K: Ord, V>,
1237 map,
041b39d2
XL
1238 BTreeMap::new());
1239
1240#[cfg(feature = "std")]
1241map_impl!(
1242 HashMap<K: Eq + Hash, V, S: BuildHasher + Default>,
1243 map,
041b39d2
XL
1244 HashMap::with_capacity_and_hasher(size_hint::cautious(map.size_hint()), S::default()));
1245
1246////////////////////////////////////////////////////////////////////////////////
1247
1248#[cfg(feature = "std")]
abe05a73 1249macro_rules! parse_ip_impl {
8faf50e0 1250 ($expecting:tt $ty:ty; $size:tt) => {
041b39d2
XL
1251 impl<'de> Deserialize<'de> for $ty {
1252 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
1253 where
1254 D: Deserializer<'de>,
1255 {
abe05a73 1256 if deserializer.is_human_readable() {
8faf50e0
XL
1257 struct IpAddrVisitor;
1258
1259 impl<'de> Visitor<'de> for IpAddrVisitor {
1260 type Value = $ty;
1261
1262 fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
1263 formatter.write_str($expecting)
1264 }
1265
1266 fn visit_str<E>(self, s: &str) -> Result<Self::Value, E>
1267 where
1268 E: Error,
1269 {
1270 s.parse().map_err(Error::custom)
1271 }
1272 }
1273
1274 deserializer.deserialize_str(IpAddrVisitor)
abe05a73
XL
1275 } else {
1276 <[u8; $size]>::deserialize(deserializer).map(<$ty>::from)
1277 }
1278 }
1279 }
83c7162d 1280 };
abe05a73
XL
1281}
1282
1283#[cfg(feature = "std")]
1284macro_rules! variant_identifier {
1285 (
1286 $name_kind: ident ( $($variant: ident; $bytes: expr; $index: expr),* )
1287 $expecting_message: expr,
1288 $variants_name: ident
1289 ) => {
1290 enum $name_kind {
1291 $( $variant ),*
1292 }
1293
1294 static $variants_name: &'static [&'static str] = &[ $( stringify!($variant) ),*];
1295
1296 impl<'de> Deserialize<'de> for $name_kind {
1297 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
1298 where
1299 D: Deserializer<'de>,
1300 {
1301 struct KindVisitor;
1302
1303 impl<'de> Visitor<'de> for KindVisitor {
1304 type Value = $name_kind;
1305
1306 fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
1307 formatter.write_str($expecting_message)
1308 }
1309
1310 fn visit_u32<E>(self, value: u32) -> Result<Self::Value, E>
1311 where
1312 E: Error,
1313 {
1314 match value {
1315 $(
1316 $index => Ok($name_kind :: $variant),
1317 )*
1318 _ => Err(Error::invalid_value(Unexpected::Unsigned(value as u64), &self),),
1319 }
1320 }
1321
1322 fn visit_str<E>(self, value: &str) -> Result<Self::Value, E>
1323 where
1324 E: Error,
1325 {
1326 match value {
1327 $(
1328 stringify!($variant) => Ok($name_kind :: $variant),
1329 )*
1330 _ => Err(Error::unknown_variant(value, $variants_name)),
1331 }
1332 }
1333
1334 fn visit_bytes<E>(self, value: &[u8]) -> Result<Self::Value, E>
1335 where
1336 E: Error,
1337 {
1338 match value {
1339 $(
1340 $bytes => Ok($name_kind :: $variant),
1341 )*
1342 _ => {
1343 match str::from_utf8(value) {
1344 Ok(value) => Err(Error::unknown_variant(value, $variants_name)),
1345 Err(_) => Err(Error::invalid_value(Unexpected::Bytes(value), &self)),
1346 }
1347 }
1348 }
1349 }
1350 }
1351
1352 deserializer.deserialize_identifier(KindVisitor)
1353 }
1354 }
1355 }
1356}
1357
1358#[cfg(feature = "std")]
1359macro_rules! deserialize_enum {
1360 (
1361 $name: ident $name_kind: ident ( $($variant: ident; $bytes: expr; $index: expr),* )
1362 $expecting_message: expr,
1363 $deserializer: expr
1364 ) => {
1365 variant_identifier!{
1366 $name_kind ( $($variant; $bytes; $index),* )
1367 $expecting_message,
1368 VARIANTS
1369 }
1370
1371 struct EnumVisitor;
1372 impl<'de> Visitor<'de> for EnumVisitor {
1373 type Value = $name;
1374
1375 fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
1376 formatter.write_str(concat!("a ", stringify!($name)))
1377 }
1378
1379
1380 fn visit_enum<A>(self, data: A) -> Result<Self::Value, A::Error>
1381 where
1382 A: EnumAccess<'de>,
1383 {
1384 match try!(data.variant()) {
1385 $(
1386 ($name_kind :: $variant, v) => v.newtype_variant().map($name :: $variant),
1387 )*
1388 }
1389 }
1390 }
1391 $deserializer.deserialize_enum(stringify!($name), VARIANTS, EnumVisitor)
1392 }
1393}
1394
1395#[cfg(feature = "std")]
1396impl<'de> Deserialize<'de> for net::IpAddr {
1397 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
1398 where
1399 D: Deserializer<'de>,
1400 {
1401 if deserializer.is_human_readable() {
8faf50e0
XL
1402 struct IpAddrVisitor;
1403
1404 impl<'de> Visitor<'de> for IpAddrVisitor {
1405 type Value = net::IpAddr;
1406
1407 fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
1408 formatter.write_str("IP address")
1409 }
1410
1411 fn visit_str<E>(self, s: &str) -> Result<Self::Value, E>
1412 where
1413 E: Error,
1414 {
1415 s.parse().map_err(Error::custom)
1416 }
1417 }
1418
1419 deserializer.deserialize_str(IpAddrVisitor)
abe05a73
XL
1420 } else {
1421 use lib::net::IpAddr;
0731742a 1422 deserialize_enum! {
abe05a73
XL
1423 IpAddr IpAddrKind (V4; b"V4"; 0, V6; b"V6"; 1)
1424 "`V4` or `V6`",
1425 deserializer
041b39d2
XL
1426 }
1427 }
1428 }
1429}
1430
1431#[cfg(feature = "std")]
8faf50e0 1432parse_ip_impl!("IPv4 address" net::Ipv4Addr; 4);
041b39d2
XL
1433
1434#[cfg(feature = "std")]
8faf50e0 1435parse_ip_impl!("IPv6 address" net::Ipv6Addr; 16);
041b39d2
XL
1436
1437#[cfg(feature = "std")]
abe05a73 1438macro_rules! parse_socket_impl {
8faf50e0 1439 ($expecting:tt $ty:ty, $new:expr) => {
abe05a73
XL
1440 impl<'de> Deserialize<'de> for $ty {
1441 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
1442 where
1443 D: Deserializer<'de>,
1444 {
1445 if deserializer.is_human_readable() {
8faf50e0
XL
1446 struct SocketAddrVisitor;
1447
1448 impl<'de> Visitor<'de> for SocketAddrVisitor {
1449 type Value = $ty;
1450
1451 fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
1452 formatter.write_str($expecting)
1453 }
1454
1455 fn visit_str<E>(self, s: &str) -> Result<Self::Value, E>
1456 where
1457 E: Error,
1458 {
1459 s.parse().map_err(Error::custom)
1460 }
1461 }
1462
1463 deserializer.deserialize_str(SocketAddrVisitor)
abe05a73
XL
1464 } else {
1465 <(_, u16)>::deserialize(deserializer).map(|(ip, port)| $new(ip, port))
1466 }
1467 }
1468 }
83c7162d 1469 };
abe05a73 1470}
041b39d2
XL
1471
1472#[cfg(feature = "std")]
abe05a73
XL
1473impl<'de> Deserialize<'de> for net::SocketAddr {
1474 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
1475 where
1476 D: Deserializer<'de>,
1477 {
1478 if deserializer.is_human_readable() {
8faf50e0
XL
1479 struct SocketAddrVisitor;
1480
1481 impl<'de> Visitor<'de> for SocketAddrVisitor {
1482 type Value = net::SocketAddr;
1483
1484 fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
1485 formatter.write_str("socket address")
1486 }
1487
1488 fn visit_str<E>(self, s: &str) -> Result<Self::Value, E>
1489 where
1490 E: Error,
1491 {
1492 s.parse().map_err(Error::custom)
1493 }
1494 }
1495
1496 deserializer.deserialize_str(SocketAddrVisitor)
abe05a73
XL
1497 } else {
1498 use lib::net::SocketAddr;
0731742a 1499 deserialize_enum! {
abe05a73
XL
1500 SocketAddr SocketAddrKind (V4; b"V4"; 0, V6; b"V6"; 1)
1501 "`V4` or `V6`",
1502 deserializer
1503 }
1504 }
1505 }
1506}
041b39d2
XL
1507
1508#[cfg(feature = "std")]
8faf50e0 1509parse_socket_impl!("IPv4 socket address" net::SocketAddrV4, net::SocketAddrV4::new);
041b39d2
XL
1510
1511#[cfg(feature = "std")]
8faf50e0 1512parse_socket_impl!("IPv6 socket address" net::SocketAddrV6, |ip, port| net::SocketAddrV6::new(
83c7162d 1513 ip, port, 0, 0
ff7c6d11 1514));
041b39d2
XL
1515
1516////////////////////////////////////////////////////////////////////////////////
1517
1518#[cfg(feature = "std")]
1519struct PathVisitor;
1520
1521#[cfg(feature = "std")]
1522impl<'a> Visitor<'a> for PathVisitor {
1523 type Value = &'a Path;
1524
1525 fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
1526 formatter.write_str("a borrowed path")
1527 }
1528
1529 fn visit_borrowed_str<E>(self, v: &'a str) -> Result<Self::Value, E>
1530 where
1531 E: Error,
1532 {
1533 Ok(v.as_ref())
1534 }
1535
1536 fn visit_borrowed_bytes<E>(self, v: &'a [u8]) -> Result<Self::Value, E>
1537 where
1538 E: Error,
1539 {
1540 str::from_utf8(v)
1541 .map(AsRef::as_ref)
1542 .map_err(|_| Error::invalid_value(Unexpected::Bytes(v), &self))
1543 }
1544}
1545
1546#[cfg(feature = "std")]
1547impl<'de: 'a, 'a> Deserialize<'de> for &'a Path {
1548 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
1549 where
1550 D: Deserializer<'de>,
1551 {
1552 deserializer.deserialize_str(PathVisitor)
1553 }
1554}
1555
1556#[cfg(feature = "std")]
1557struct PathBufVisitor;
1558
1559#[cfg(feature = "std")]
1560impl<'de> Visitor<'de> for PathBufVisitor {
1561 type Value = PathBuf;
1562
1563 fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
1564 formatter.write_str("path string")
1565 }
1566
8faf50e0 1567 fn visit_str<E>(self, v: &str) -> Result<Self::Value, E>
041b39d2
XL
1568 where
1569 E: Error,
1570 {
1571 Ok(From::from(v))
1572 }
1573
8faf50e0 1574 fn visit_string<E>(self, v: String) -> Result<Self::Value, E>
041b39d2
XL
1575 where
1576 E: Error,
1577 {
1578 Ok(From::from(v))
1579 }
1580}
1581
1582#[cfg(feature = "std")]
1583impl<'de> Deserialize<'de> for PathBuf {
8faf50e0 1584 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
041b39d2
XL
1585 where
1586 D: Deserializer<'de>,
1587 {
1588 deserializer.deserialize_string(PathBufVisitor)
1589 }
1590}
1591
1592////////////////////////////////////////////////////////////////////////////////
1593
1594// If this were outside of the serde crate, it would just use:
1595//
1596// #[derive(Deserialize)]
1597// #[serde(variant_identifier)]
1598#[cfg(all(feature = "std", any(unix, windows)))]
0731742a 1599variant_identifier! {
abe05a73
XL
1600 OsStringKind (Unix; b"Unix"; 0, Windows; b"Windows"; 1)
1601 "`Unix` or `Windows`",
1602 OSSTR_VARIANTS
041b39d2
XL
1603}
1604
1605#[cfg(all(feature = "std", any(unix, windows)))]
1606struct OsStringVisitor;
1607
1608#[cfg(all(feature = "std", any(unix, windows)))]
1609impl<'de> Visitor<'de> for OsStringVisitor {
1610 type Value = OsString;
1611
1612 fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
1613 formatter.write_str("os string")
1614 }
1615
1616 #[cfg(unix)]
8faf50e0 1617 fn visit_enum<A>(self, data: A) -> Result<Self::Value, A::Error>
041b39d2
XL
1618 where
1619 A: EnumAccess<'de>,
1620 {
1621 use std::os::unix::ffi::OsStringExt;
1622
1623 match try!(data.variant()) {
1624 (OsStringKind::Unix, v) => v.newtype_variant().map(OsString::from_vec),
ff7c6d11
XL
1625 (OsStringKind::Windows, _) => Err(Error::custom(
1626 "cannot deserialize Windows OS string on Unix",
1627 )),
041b39d2
XL
1628 }
1629 }
1630
1631 #[cfg(windows)]
8faf50e0 1632 fn visit_enum<A>(self, data: A) -> Result<Self::Value, A::Error>
041b39d2
XL
1633 where
1634 A: EnumAccess<'de>,
1635 {
1636 use std::os::windows::ffi::OsStringExt;
1637
1638 match try!(data.variant()) {
8faf50e0
XL
1639 (OsStringKind::Windows, v) => v
1640 .newtype_variant::<Vec<u16>>()
ff7c6d11
XL
1641 .map(|vec| OsString::from_wide(&vec)),
1642 (OsStringKind::Unix, _) => Err(Error::custom(
1643 "cannot deserialize Unix OS string on Windows",
1644 )),
041b39d2
XL
1645 }
1646 }
1647}
1648
1649#[cfg(all(feature = "std", any(unix, windows)))]
1650impl<'de> Deserialize<'de> for OsString {
8faf50e0 1651 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
041b39d2
XL
1652 where
1653 D: Deserializer<'de>,
1654 {
1655 deserializer.deserialize_enum("OsString", OSSTR_VARIANTS, OsStringVisitor)
1656 }
1657}
1658
1659////////////////////////////////////////////////////////////////////////////////
1660
1661#[cfg(any(feature = "std", feature = "alloc"))]
3b2f2976 1662forwarded_impl!((T), Box<T>, Box::new);
041b39d2
XL
1663
1664#[cfg(any(feature = "std", feature = "alloc"))]
3b2f2976 1665forwarded_impl!((T), Box<[T]>, Vec::into_boxed_slice);
041b39d2
XL
1666
1667#[cfg(any(feature = "std", feature = "alloc"))]
3b2f2976 1668forwarded_impl!((), Box<str>, String::into_boxed_str);
041b39d2 1669
b7449926
XL
1670#[cfg(all(
1671 not(de_rc_dst),
1672 feature = "rc",
1673 any(feature = "std", feature = "alloc")
1674))]
83c7162d
XL
1675forwarded_impl! {
1676 /// This impl requires the [`"rc"`] Cargo feature of Serde.
1677 ///
1678 /// Deserializing a data structure containing `Arc` will not attempt to
1679 /// deduplicate `Arc` references to the same data. Every deserialized `Arc`
1680 /// will end up with a strong count of 1.
1681 ///
1682 /// [`"rc"`]: https://serde.rs/feature-flags.html#-features-rc
1683 (T), Arc<T>, Arc::new
1684}
041b39d2 1685
b7449926
XL
1686#[cfg(all(
1687 not(de_rc_dst),
1688 feature = "rc",
1689 any(feature = "std", feature = "alloc")
1690))]
83c7162d
XL
1691forwarded_impl! {
1692 /// This impl requires the [`"rc"`] Cargo feature of Serde.
1693 ///
1694 /// Deserializing a data structure containing `Rc` will not attempt to
1695 /// deduplicate `Rc` references to the same data. Every deserialized `Rc`
1696 /// will end up with a strong count of 1.
1697 ///
1698 /// [`"rc"`]: https://serde.rs/feature-flags.html#-features-rc
1699 (T), Rc<T>, Rc::new
1700}
041b39d2
XL
1701
1702#[cfg(any(feature = "std", feature = "alloc"))]
1703impl<'de, 'a, T: ?Sized> Deserialize<'de> for Cow<'a, T>
1704where
1705 T: ToOwned,
1706 T::Owned: Deserialize<'de>,
1707{
1708 #[inline]
8faf50e0 1709 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
041b39d2
XL
1710 where
1711 D: Deserializer<'de>,
1712 {
1713 T::Owned::deserialize(deserializer).map(Cow::Owned)
1714 }
1715}
1716
1717////////////////////////////////////////////////////////////////////////////////
ea8adc8c 1718
8faf50e0
XL
1719/// This impl requires the [`"rc"`] Cargo feature of Serde. The resulting
1720/// `Weak<T>` has a reference count of 0 and cannot be upgraded.
1721///
1722/// [`"rc"`]: https://serde.rs/feature-flags.html#-features-rc
1723#[cfg(all(feature = "rc", any(feature = "std", feature = "alloc")))]
1724impl<'de, T: ?Sized> Deserialize<'de> for RcWeak<T>
1725where
1726 T: Deserialize<'de>,
1727{
1728 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
1729 where
1730 D: Deserializer<'de>,
1731 {
1732 try!(Option::<T>::deserialize(deserializer));
1733 Ok(RcWeak::new())
1734 }
1735}
1736
1737/// This impl requires the [`"rc"`] Cargo feature of Serde. The resulting
1738/// `Weak<T>` has a reference count of 0 and cannot be upgraded.
1739///
1740/// [`"rc"`]: https://serde.rs/feature-flags.html#-features-rc
1741#[cfg(all(feature = "rc", any(feature = "std", feature = "alloc")))]
1742impl<'de, T: ?Sized> Deserialize<'de> for ArcWeak<T>
1743where
1744 T: Deserialize<'de>,
1745{
1746 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
1747 where
1748 D: Deserializer<'de>,
1749 {
1750 try!(Option::<T>::deserialize(deserializer));
1751 Ok(ArcWeak::new())
1752 }
1753}
1754
1755////////////////////////////////////////////////////////////////////////////////
1756
0731742a 1757#[cfg(all(de_rc_dst, feature = "rc", any(feature = "std", feature = "alloc")))]
ea8adc8c 1758macro_rules! box_forwarded_impl {
83c7162d
XL
1759 (
1760 $(#[doc = $doc:tt])*
1761 $t:ident
1762 ) => {
1763 $(#[doc = $doc])*
ea8adc8c
XL
1764 impl<'de, T: ?Sized> Deserialize<'de> for $t<T>
1765 where
1766 Box<T>: Deserialize<'de>,
1767 {
1768 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
1769 where
1770 D: Deserializer<'de>,
1771 {
1772 Box::deserialize(deserializer).map(Into::into)
1773 }
1774 }
83c7162d 1775 };
ea8adc8c
XL
1776}
1777
0731742a 1778#[cfg(all(de_rc_dst, feature = "rc", any(feature = "std", feature = "alloc")))]
83c7162d
XL
1779box_forwarded_impl! {
1780 /// This impl requires the [`"rc"`] Cargo feature of Serde.
1781 ///
1782 /// Deserializing a data structure containing `Rc` will not attempt to
1783 /// deduplicate `Rc` references to the same data. Every deserialized `Rc`
1784 /// will end up with a strong count of 1.
1785 ///
1786 /// [`"rc"`]: https://serde.rs/feature-flags.html#-features-rc
1787 Rc
1788}
ea8adc8c 1789
0731742a 1790#[cfg(all(de_rc_dst, feature = "rc", any(feature = "std", feature = "alloc")))]
83c7162d
XL
1791box_forwarded_impl! {
1792 /// This impl requires the [`"rc"`] Cargo feature of Serde.
1793 ///
1794 /// Deserializing a data structure containing `Arc` will not attempt to
1795 /// deduplicate `Arc` references to the same data. Every deserialized `Arc`
1796 /// will end up with a strong count of 1.
1797 ///
1798 /// [`"rc"`]: https://serde.rs/feature-flags.html#-features-rc
1799 Arc
1800}
ea8adc8c
XL
1801
1802////////////////////////////////////////////////////////////////////////////////
041b39d2
XL
1803
1804impl<'de, T> Deserialize<'de> for Cell<T>
1805where
1806 T: Deserialize<'de> + Copy,
1807{
8faf50e0 1808 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
041b39d2
XL
1809 where
1810 D: Deserializer<'de>,
1811 {
1812 T::deserialize(deserializer).map(Cell::new)
1813 }
1814}
1815
3b2f2976 1816forwarded_impl!((T), RefCell<T>, RefCell::new);
041b39d2
XL
1817
1818#[cfg(feature = "std")]
3b2f2976 1819forwarded_impl!((T), Mutex<T>, Mutex::new);
041b39d2
XL
1820
1821#[cfg(feature = "std")]
3b2f2976 1822forwarded_impl!((T), RwLock<T>, RwLock::new);
041b39d2
XL
1823
1824////////////////////////////////////////////////////////////////////////////////
1825
1826// This is a cleaned-up version of the impl generated by:
1827//
1828// #[derive(Deserialize)]
1829// #[serde(deny_unknown_fields)]
1830// struct Duration {
1831// secs: u64,
1832// nanos: u32,
1833// }
8faf50e0 1834#[cfg(any(core_duration, feature = "std"))]
041b39d2
XL
1835impl<'de> Deserialize<'de> for Duration {
1836 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
1837 where
1838 D: Deserializer<'de>,
1839 {
1840 // If this were outside of the serde crate, it would just use:
1841 //
1842 // #[derive(Deserialize)]
1843 // #[serde(field_identifier, rename_all = "lowercase")]
1844 enum Field {
1845 Secs,
1846 Nanos,
1847 };
1848
1849 impl<'de> Deserialize<'de> for Field {
8faf50e0 1850 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
041b39d2
XL
1851 where
1852 D: Deserializer<'de>,
1853 {
1854 struct FieldVisitor;
1855
1856 impl<'de> Visitor<'de> for FieldVisitor {
1857 type Value = Field;
1858
1859 fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
1860 formatter.write_str("`secs` or `nanos`")
1861 }
1862
8faf50e0 1863 fn visit_str<E>(self, value: &str) -> Result<Self::Value, E>
041b39d2
XL
1864 where
1865 E: Error,
1866 {
1867 match value {
1868 "secs" => Ok(Field::Secs),
1869 "nanos" => Ok(Field::Nanos),
1870 _ => Err(Error::unknown_field(value, FIELDS)),
1871 }
1872 }
1873
8faf50e0 1874 fn visit_bytes<E>(self, value: &[u8]) -> Result<Self::Value, E>
041b39d2
XL
1875 where
1876 E: Error,
1877 {
1878 match value {
1879 b"secs" => Ok(Field::Secs),
1880 b"nanos" => Ok(Field::Nanos),
1881 _ => {
8faf50e0 1882 let value = ::export::from_utf8_lossy(value);
041b39d2
XL
1883 Err(Error::unknown_field(&value, FIELDS))
1884 }
1885 }
1886 }
1887 }
1888
1889 deserializer.deserialize_identifier(FieldVisitor)
1890 }
1891 }
1892
1893 struct DurationVisitor;
1894
1895 impl<'de> Visitor<'de> for DurationVisitor {
1896 type Value = Duration;
1897
1898 fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
1899 formatter.write_str("struct Duration")
1900 }
1901
8faf50e0 1902 fn visit_seq<A>(self, mut seq: A) -> Result<Self::Value, A::Error>
041b39d2
XL
1903 where
1904 A: SeqAccess<'de>,
1905 {
1906 let secs: u64 = match try!(seq.next_element()) {
1907 Some(value) => value,
1908 None => {
1909 return Err(Error::invalid_length(0, &self));
1910 }
1911 };
1912 let nanos: u32 = match try!(seq.next_element()) {
1913 Some(value) => value,
1914 None => {
1915 return Err(Error::invalid_length(1, &self));
1916 }
1917 };
1918 Ok(Duration::new(secs, nanos))
1919 }
1920
8faf50e0 1921 fn visit_map<A>(self, mut map: A) -> Result<Self::Value, A::Error>
041b39d2
XL
1922 where
1923 A: MapAccess<'de>,
1924 {
1925 let mut secs: Option<u64> = None;
1926 let mut nanos: Option<u32> = None;
1927 while let Some(key) = try!(map.next_key()) {
1928 match key {
1929 Field::Secs => {
1930 if secs.is_some() {
1931 return Err(<A::Error as Error>::duplicate_field("secs"));
1932 }
1933 secs = Some(try!(map.next_value()));
1934 }
1935 Field::Nanos => {
1936 if nanos.is_some() {
1937 return Err(<A::Error as Error>::duplicate_field("nanos"));
1938 }
1939 nanos = Some(try!(map.next_value()));
1940 }
1941 }
1942 }
1943 let secs = match secs {
1944 Some(secs) => secs,
1945 None => return Err(<A::Error as Error>::missing_field("secs")),
1946 };
1947 let nanos = match nanos {
1948 Some(nanos) => nanos,
1949 None => return Err(<A::Error as Error>::missing_field("nanos")),
1950 };
1951 Ok(Duration::new(secs, nanos))
1952 }
1953 }
1954
1955 const FIELDS: &'static [&'static str] = &["secs", "nanos"];
1956 deserializer.deserialize_struct("Duration", FIELDS, DurationVisitor)
1957 }
1958}
1959
1960////////////////////////////////////////////////////////////////////////////////
1961
1962#[cfg(feature = "std")]
1963impl<'de> Deserialize<'de> for SystemTime {
1964 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
1965 where
1966 D: Deserializer<'de>,
1967 {
1968 // Reuse duration
1969 enum Field {
1970 Secs,
1971 Nanos,
1972 };
1973
1974 impl<'de> Deserialize<'de> for Field {
8faf50e0 1975 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
041b39d2
XL
1976 where
1977 D: Deserializer<'de>,
1978 {
1979 struct FieldVisitor;
1980
1981 impl<'de> Visitor<'de> for FieldVisitor {
1982 type Value = Field;
1983
1984 fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
1985 formatter.write_str("`secs_since_epoch` or `nanos_since_epoch`")
1986 }
1987
8faf50e0 1988 fn visit_str<E>(self, value: &str) -> Result<Self::Value, E>
041b39d2
XL
1989 where
1990 E: Error,
1991 {
1992 match value {
1993 "secs_since_epoch" => Ok(Field::Secs),
1994 "nanos_since_epoch" => Ok(Field::Nanos),
1995 _ => Err(Error::unknown_field(value, FIELDS)),
1996 }
1997 }
1998
8faf50e0 1999 fn visit_bytes<E>(self, value: &[u8]) -> Result<Self::Value, E>
041b39d2
XL
2000 where
2001 E: Error,
2002 {
2003 match value {
2004 b"secs_since_epoch" => Ok(Field::Secs),
2005 b"nanos_since_epoch" => Ok(Field::Nanos),
2006 _ => {
2007 let value = String::from_utf8_lossy(value);
2008 Err(Error::unknown_field(&value, FIELDS))
2009 }
2010 }
2011 }
2012 }
2013
2014 deserializer.deserialize_identifier(FieldVisitor)
2015 }
2016 }
2017
2018 struct DurationVisitor;
2019
2020 impl<'de> Visitor<'de> for DurationVisitor {
2021 type Value = Duration;
2022
2023 fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
2024 formatter.write_str("struct SystemTime")
2025 }
2026
8faf50e0 2027 fn visit_seq<A>(self, mut seq: A) -> Result<Self::Value, A::Error>
041b39d2
XL
2028 where
2029 A: SeqAccess<'de>,
2030 {
2031 let secs: u64 = match try!(seq.next_element()) {
2032 Some(value) => value,
2033 None => {
2034 return Err(Error::invalid_length(0, &self));
2035 }
2036 };
2037 let nanos: u32 = match try!(seq.next_element()) {
2038 Some(value) => value,
2039 None => {
2040 return Err(Error::invalid_length(1, &self));
2041 }
2042 };
2043 Ok(Duration::new(secs, nanos))
2044 }
2045
8faf50e0 2046 fn visit_map<A>(self, mut map: A) -> Result<Self::Value, A::Error>
041b39d2
XL
2047 where
2048 A: MapAccess<'de>,
2049 {
2050 let mut secs: Option<u64> = None;
2051 let mut nanos: Option<u32> = None;
2052 while let Some(key) = try!(map.next_key()) {
2053 match key {
2054 Field::Secs => {
2055 if secs.is_some() {
ff7c6d11
XL
2056 return Err(<A::Error as Error>::duplicate_field(
2057 "secs_since_epoch",
2058 ));
041b39d2
XL
2059 }
2060 secs = Some(try!(map.next_value()));
2061 }
2062 Field::Nanos => {
2063 if nanos.is_some() {
ff7c6d11
XL
2064 return Err(<A::Error as Error>::duplicate_field(
2065 "nanos_since_epoch",
2066 ));
041b39d2
XL
2067 }
2068 nanos = Some(try!(map.next_value()));
2069 }
2070 }
2071 }
2072 let secs = match secs {
2073 Some(secs) => secs,
2074 None => return Err(<A::Error as Error>::missing_field("secs_since_epoch")),
2075 };
2076 let nanos = match nanos {
2077 Some(nanos) => nanos,
2078 None => return Err(<A::Error as Error>::missing_field("nanos_since_epoch")),
2079 };
2080 Ok(Duration::new(secs, nanos))
2081 }
2082 }
2083
2084 const FIELDS: &'static [&'static str] = &["secs_since_epoch", "nanos_since_epoch"];
2085 let duration = try!(deserializer.deserialize_struct("SystemTime", FIELDS, DurationVisitor));
2086 Ok(UNIX_EPOCH + duration)
2087 }
2088}
2089
2090////////////////////////////////////////////////////////////////////////////////
2091
2092// Similar to:
2093//
2094// #[derive(Deserialize)]
2095// #[serde(deny_unknown_fields)]
2096// struct Range {
2097// start: u64,
2098// end: u32,
2099// }
b7449926 2100impl<'de, Idx> Deserialize<'de> for Range<Idx>
041b39d2
XL
2101where
2102 Idx: Deserialize<'de>,
2103{
2104 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
2105 where
2106 D: Deserializer<'de>,
2107 {
b7449926
XL
2108 let (start, end) = deserializer.deserialize_struct(
2109 "Range",
2110 range::FIELDS,
2111 range::RangeVisitor {
2112 expecting: "struct Range",
2113 phantom: PhantomData,
2114 },
2115 )?;
2116 Ok(start..end)
2117 }
2118}
041b39d2 2119
b7449926
XL
2120#[cfg(range_inclusive)]
2121impl<'de, Idx> Deserialize<'de> for RangeInclusive<Idx>
2122where
2123 Idx: Deserialize<'de>,
2124{
2125 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
2126 where
2127 D: Deserializer<'de>,
2128 {
2129 let (start, end) = deserializer.deserialize_struct(
2130 "RangeInclusive",
2131 range::FIELDS,
2132 range::RangeVisitor {
2133 expecting: "struct RangeInclusive",
2134 phantom: PhantomData,
2135 },
2136 )?;
2137 Ok(RangeInclusive::new(start, end))
2138 }
2139}
041b39d2 2140
b7449926
XL
2141mod range {
2142 use lib::*;
041b39d2 2143
b7449926 2144 use de::{Deserialize, Deserializer, Error, MapAccess, SeqAccess, Visitor};
041b39d2 2145
b7449926
XL
2146 pub const FIELDS: &'static [&'static str] = &["start", "end"];
2147
2148 // If this were outside of the serde crate, it would just use:
2149 //
2150 // #[derive(Deserialize)]
2151 // #[serde(field_identifier, rename_all = "lowercase")]
2152 enum Field {
2153 Start,
2154 End,
2155 }
2156
2157 impl<'de> Deserialize<'de> for Field {
2158 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
2159 where
2160 D: Deserializer<'de>,
2161 {
2162 struct FieldVisitor;
2163
2164 impl<'de> Visitor<'de> for FieldVisitor {
2165 type Value = Field;
2166
2167 fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
2168 formatter.write_str("`start` or `end`")
2169 }
2170
2171 fn visit_str<E>(self, value: &str) -> Result<Self::Value, E>
2172 where
2173 E: Error,
2174 {
2175 match value {
2176 "start" => Ok(Field::Start),
2177 "end" => Ok(Field::End),
2178 _ => Err(Error::unknown_field(value, FIELDS)),
041b39d2 2179 }
b7449926 2180 }
041b39d2 2181
b7449926
XL
2182 fn visit_bytes<E>(self, value: &[u8]) -> Result<Self::Value, E>
2183 where
2184 E: Error,
2185 {
2186 match value {
2187 b"start" => Ok(Field::Start),
2188 b"end" => Ok(Field::End),
2189 _ => {
2190 let value = ::export::from_utf8_lossy(value);
2191 Err(Error::unknown_field(&value, FIELDS))
041b39d2
XL
2192 }
2193 }
2194 }
041b39d2 2195 }
b7449926
XL
2196
2197 deserializer.deserialize_identifier(FieldVisitor)
041b39d2 2198 }
b7449926 2199 }
041b39d2 2200
b7449926
XL
2201 pub struct RangeVisitor<Idx> {
2202 pub expecting: &'static str,
2203 pub phantom: PhantomData<Idx>,
2204 }
2205
2206 impl<'de, Idx> Visitor<'de> for RangeVisitor<Idx>
2207 where
2208 Idx: Deserialize<'de>,
2209 {
2210 type Value = (Idx, Idx);
2211
2212 fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
2213 formatter.write_str(self.expecting)
041b39d2
XL
2214 }
2215
b7449926 2216 fn visit_seq<A>(self, mut seq: A) -> Result<Self::Value, A::Error>
041b39d2 2217 where
b7449926 2218 A: SeqAccess<'de>,
041b39d2 2219 {
b7449926
XL
2220 let start: Idx = match try!(seq.next_element()) {
2221 Some(value) => value,
2222 None => {
2223 return Err(Error::invalid_length(0, &self));
2224 }
2225 };
2226 let end: Idx = match try!(seq.next_element()) {
2227 Some(value) => value,
2228 None => {
2229 return Err(Error::invalid_length(1, &self));
2230 }
2231 };
2232 Ok((start, end))
2233 }
041b39d2 2234
b7449926
XL
2235 fn visit_map<A>(self, mut map: A) -> Result<Self::Value, A::Error>
2236 where
2237 A: MapAccess<'de>,
2238 {
2239 let mut start: Option<Idx> = None;
2240 let mut end: Option<Idx> = None;
2241 while let Some(key) = try!(map.next_key()) {
2242 match key {
2243 Field::Start => {
2244 if start.is_some() {
2245 return Err(<A::Error as Error>::duplicate_field("start"));
041b39d2 2246 }
b7449926
XL
2247 start = Some(try!(map.next_value()));
2248 }
2249 Field::End => {
2250 if end.is_some() {
2251 return Err(<A::Error as Error>::duplicate_field("end"));
041b39d2 2252 }
b7449926 2253 end = Some(try!(map.next_value()));
041b39d2
XL
2254 }
2255 }
041b39d2 2256 }
b7449926
XL
2257 let start = match start {
2258 Some(start) => start,
2259 None => return Err(<A::Error as Error>::missing_field("start")),
2260 };
2261 let end = match end {
2262 Some(end) => end,
2263 None => return Err(<A::Error as Error>::missing_field("end")),
2264 };
2265 Ok((start, end))
041b39d2 2266 }
041b39d2
XL
2267 }
2268}
2269
2270////////////////////////////////////////////////////////////////////////////////
2271
0531ce1d 2272macro_rules! nonzero_integers {
8faf50e0 2273 ( $( $T: ident, )+ ) => {
0531ce1d 2274 $(
8faf50e0
XL
2275 #[cfg(num_nonzero)]
2276 impl<'de> Deserialize<'de> for num::$T {
2277 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
0531ce1d
XL
2278 where
2279 D: Deserializer<'de>,
2280 {
2281 let value = try!(Deserialize::deserialize(deserializer));
8faf50e0 2282 match <num::$T>::new(value) {
0531ce1d
XL
2283 Some(nonzero) => Ok(nonzero),
2284 None => Err(Error::custom("expected a non-zero value")),
2285 }
2286 }
2287 }
2288 )+
2289 };
2290}
2291
2292nonzero_integers! {
2293 // Not including signed NonZeroI* since they might be removed
2294 NonZeroU8,
2295 NonZeroU16,
2296 NonZeroU32,
2297 NonZeroU64,
0531ce1d
XL
2298 NonZeroUsize,
2299}
2300
0731742a
XL
2301// Currently 128-bit integers do not work on Emscripten targets so we need an
2302// additional `#[cfg]`
2303serde_if_integer128! {
2304 nonzero_integers! {
2305 NonZeroU128,
2306 }
2307}
2308
041b39d2
XL
2309////////////////////////////////////////////////////////////////////////////////
2310
2311impl<'de, T, E> Deserialize<'de> for Result<T, E>
2312where
2313 T: Deserialize<'de>,
2314 E: Deserialize<'de>,
2315{
8faf50e0 2316 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
041b39d2
XL
2317 where
2318 D: Deserializer<'de>,
2319 {
2320 // If this were outside of the serde crate, it would just use:
2321 //
2322 // #[derive(Deserialize)]
2323 // #[serde(variant_identifier)]
2324 enum Field {
2325 Ok,
2326 Err,
2327 }
2328
2329 impl<'de> Deserialize<'de> for Field {
2330 #[inline]
8faf50e0 2331 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
041b39d2
XL
2332 where
2333 D: Deserializer<'de>,
2334 {
2335 struct FieldVisitor;
2336
2337 impl<'de> Visitor<'de> for FieldVisitor {
2338 type Value = Field;
2339
2340 fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
2341 formatter.write_str("`Ok` or `Err`")
2342 }
2343
8faf50e0 2344 fn visit_u32<E>(self, value: u32) -> Result<Self::Value, E>
041b39d2
XL
2345 where
2346 E: Error,
2347 {
2348 match value {
2349 0 => Ok(Field::Ok),
2350 1 => Ok(Field::Err),
ff7c6d11
XL
2351 _ => Err(Error::invalid_value(
2352 Unexpected::Unsigned(value as u64),
2353 &self,
2354 )),
041b39d2
XL
2355 }
2356 }
2357
8faf50e0 2358 fn visit_str<E>(self, value: &str) -> Result<Self::Value, E>
041b39d2
XL
2359 where
2360 E: Error,
2361 {
2362 match value {
2363 "Ok" => Ok(Field::Ok),
2364 "Err" => Ok(Field::Err),
2365 _ => Err(Error::unknown_variant(value, VARIANTS)),
2366 }
2367 }
2368
8faf50e0 2369 fn visit_bytes<E>(self, value: &[u8]) -> Result<Self::Value, E>
041b39d2
XL
2370 where
2371 E: Error,
2372 {
2373 match value {
2374 b"Ok" => Ok(Field::Ok),
2375 b"Err" => Ok(Field::Err),
ff7c6d11
XL
2376 _ => match str::from_utf8(value) {
2377 Ok(value) => Err(Error::unknown_variant(value, VARIANTS)),
2378 Err(_) => {
2379 Err(Error::invalid_value(Unexpected::Bytes(value), &self))
041b39d2 2380 }
ff7c6d11 2381 },
041b39d2
XL
2382 }
2383 }
2384 }
2385
2386 deserializer.deserialize_identifier(FieldVisitor)
2387 }
2388 }
2389
2390 struct ResultVisitor<T, E>(PhantomData<Result<T, E>>);
2391
2392 impl<'de, T, E> Visitor<'de> for ResultVisitor<T, E>
2393 where
2394 T: Deserialize<'de>,
2395 E: Deserialize<'de>,
2396 {
2397 type Value = Result<T, E>;
2398
2399 fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
2400 formatter.write_str("enum Result")
2401 }
2402
8faf50e0 2403 fn visit_enum<A>(self, data: A) -> Result<Self::Value, A::Error>
041b39d2
XL
2404 where
2405 A: EnumAccess<'de>,
2406 {
2407 match try!(data.variant()) {
2408 (Field::Ok, v) => v.newtype_variant().map(Ok),
2409 (Field::Err, v) => v.newtype_variant().map(Err),
2410 }
2411 }
2412 }
2413
2414 const VARIANTS: &'static [&'static str] = &["Ok", "Err"];
2415
2416 deserializer.deserialize_enum("Result", VARIANTS, ResultVisitor(PhantomData))
2417 }
2418}
abe05a73
XL
2419
2420////////////////////////////////////////////////////////////////////////////////
2421
2422#[cfg(feature = "std")]
2423impl<'de, T> Deserialize<'de> for Wrapping<T>
2424where
ff7c6d11 2425 T: Deserialize<'de>,
abe05a73 2426{
8faf50e0 2427 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
abe05a73
XL
2428 where
2429 D: Deserializer<'de>,
2430 {
2431 Deserialize::deserialize(deserializer).map(Wrapping)
2432 }
2433}