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