serde_with/de/
impls.rs

1pub(crate) use self::macros::*;
2use crate::{formats::*, prelude::*};
3#[cfg(feature = "hashbrown_0_14")]
4use hashbrown_0_14::{HashMap as HashbrownMap014, HashSet as HashbrownSet014};
5#[cfg(feature = "hashbrown_0_15")]
6use hashbrown_0_15::{HashMap as HashbrownMap015, HashSet as HashbrownSet015};
7#[cfg(feature = "hashbrown_0_16")]
8use hashbrown_0_16::{HashMap as HashbrownMap016, HashSet as HashbrownSet016};
9#[cfg(feature = "indexmap_1")]
10use indexmap_1::{IndexMap, IndexSet};
11#[cfg(feature = "indexmap_2")]
12use indexmap_2::{IndexMap as IndexMap2, IndexSet as IndexSet2};
13#[cfg(feature = "smallvec_1")]
14use smallvec_1::SmallVec;
15
16///////////////////////////////////////////////////////////////////////////////
17// Helper macro used internally
18
19#[cfg(feature = "alloc")]
20type BoxedSlice<T> = Box<[T]>;
21
22pub(crate) mod macros {
23    // The unused_imports lint has false-positives around macros
24    // https://github.com/rust-lang/rust/issues/78894
25    #![allow(unused_imports)]
26
27    macro_rules! foreach_map {
28        ($m:ident) => {
29            #[cfg(feature = "alloc")]
30            $m!(BTreeMap<K: Ord, V>, (|_size| BTreeMap::new()));
31            #[cfg(feature = "std")]
32            $m!(
33                HashMap<K: Eq + Hash, V, S: BuildHasher + Default>,
34                (|size| HashMap::with_capacity_and_hasher(size, Default::default()))
35            );
36            #[cfg(feature = "hashbrown_0_14")]
37            $m!(
38                HashbrownMap014<K: Eq + Hash, V, S: BuildHasher + Default>,
39                (|size| HashbrownMap014::with_capacity_and_hasher(size, Default::default()))
40            );
41            #[cfg(feature = "hashbrown_0_15")]
42            $m!(
43                HashbrownMap015<K: Eq + Hash, V, S: BuildHasher + Default>,
44                (|size| HashbrownMap015::with_capacity_and_hasher(size, Default::default()))
45            );
46            #[cfg(feature = "hashbrown_0_16")]
47            $m!(
48                HashbrownMap016<K: Eq + Hash, V, S: BuildHasher + Default>,
49                (|size| HashbrownMap016::with_capacity_and_hasher(size, Default::default()))
50            );
51            #[cfg(feature = "indexmap_1")]
52            $m!(
53                IndexMap<K: Eq + Hash, V, S: BuildHasher + Default>,
54                (|size| IndexMap::with_capacity_and_hasher(size, Default::default()))
55            );
56            #[cfg(feature = "indexmap_2")]
57            $m!(
58                IndexMap2<K: Eq + Hash, V, S: BuildHasher + Default>,
59                (|size| IndexMap2::with_capacity_and_hasher(size, Default::default()))
60            );
61        };
62    }
63
64    macro_rules! foreach_set {
65        ($m:ident) => {
66            #[cfg(feature = "alloc")]
67            $m!(BTreeSet<T: Ord>, (|_| BTreeSet::new()), insert);
68            #[cfg(feature = "std")]
69            $m!(
70                HashSet<T: Eq + Hash, S: BuildHasher + Default>,
71                (|size| HashSet::with_capacity_and_hasher(size, S::default())),
72                insert
73            );
74            #[cfg(feature = "hashbrown_0_14")]
75            $m!(
76                HashbrownSet014<T: Eq + Hash, S: BuildHasher + Default>,
77                (|size| HashbrownSet014::with_capacity_and_hasher(size, S::default())),
78                insert
79            );
80            #[cfg(feature = "hashbrown_0_15")]
81            $m!(
82                HashbrownSet015<T: Eq + Hash, S: BuildHasher + Default>,
83                (|size| HashbrownSet015::with_capacity_and_hasher(size, S::default())),
84                insert
85            );
86            #[cfg(feature = "hashbrown_0_16")]
87            $m!(
88                HashbrownSet016<T: Eq + Hash, S: BuildHasher + Default>,
89                (|size| HashbrownSet016::with_capacity_and_hasher(size, S::default())),
90                insert
91            );
92            #[cfg(feature = "indexmap_1")]
93            $m!(
94                IndexSet<T: Eq + Hash, S: BuildHasher + Default>,
95                (|size| IndexSet::with_capacity_and_hasher(size, S::default())),
96                insert
97            );
98            #[cfg(feature = "indexmap_2")]
99            $m!(
100                IndexSet2<T: Eq + Hash, S: BuildHasher + Default>,
101                (|size| IndexSet2::with_capacity_and_hasher(size, S::default())),
102                insert
103            );
104        };
105    }
106
107    macro_rules! foreach_seq {
108        ($m:ident) => {
109            foreach_set!($m);
110
111            #[cfg(feature = "alloc")]
112            $m!(
113                BinaryHeap<T: Ord>,
114                (|size| BinaryHeap::with_capacity(size)),
115                push
116            );
117            #[cfg(feature = "alloc")]
118            $m!(BoxedSlice<T>, (|size| Vec::with_capacity(size)), push);
119            #[cfg(feature = "alloc")]
120            $m!(LinkedList<T>, (|_| LinkedList::new()), push_back);
121            #[cfg(feature = "alloc")]
122            $m!(Vec<T>, (|size| Vec::with_capacity(size)), push);
123            #[cfg(feature = "alloc")]
124            $m!(
125                VecDeque<T>,
126                (|size| VecDeque::with_capacity(size)),
127                push_back
128            );
129        };
130    }
131
132    // Make the macros available to the rest of the crate
133    pub(crate) use foreach_map;
134    pub(crate) use foreach_seq;
135    pub(crate) use foreach_set;
136}
137
138///////////////////////////////////////////////////////////////////////////////
139// region: Simple Wrapper types (e.g., Box, Option)
140
141#[allow(unused_macros)]
142macro_rules! pinned_wrapper {
143    ($wrapper:ident) => {
144        impl<'de, T, U> DeserializeAs<'de, Pin<$wrapper<T>>> for Pin<$wrapper<U>>
145        where
146            U: DeserializeAs<'de, T>,
147        {
148            fn deserialize_as<D>(deserializer: D) -> Result<Pin<$wrapper<T>>, D::Error>
149            where
150                D: Deserializer<'de>,
151            {
152                Ok($wrapper::pin(
153                    DeserializeAsWrap::<T, U>::deserialize(deserializer)?.into_inner(),
154                ))
155            }
156        }
157    };
158}
159
160#[cfg(feature = "alloc")]
161impl<'de, T, U> DeserializeAs<'de, Box<T>> for Box<U>
162where
163    U: DeserializeAs<'de, T>,
164{
165    fn deserialize_as<D>(deserializer: D) -> Result<Box<T>, D::Error>
166    where
167        D: Deserializer<'de>,
168    {
169        Ok(Box::new(
170            DeserializeAsWrap::<T, U>::deserialize(deserializer)?.into_inner(),
171        ))
172    }
173}
174
175#[cfg(feature = "alloc")]
176impl<'de, T, U> DeserializeAs<'de, Pin<Box<T>>> for Pin<Box<U>> where
    U: DeserializeAs<'de, T> {
    fn deserialize_as<D>(deserializer: D) -> Result<Pin<Box<T>>, D::Error>
        where D: Deserializer<'de> {
        Ok(Box::pin(DeserializeAsWrap::<T,
                                U>::deserialize(deserializer)?.into_inner()))
    }
}pinned_wrapper!(Box);
177
178impl<'de, T, U> DeserializeAs<'de, Option<T>> for Option<U>
179where
180    U: DeserializeAs<'de, T>,
181{
182    fn deserialize_as<D>(deserializer: D) -> Result<Option<T>, D::Error>
183    where
184        D: Deserializer<'de>,
185    {
186        struct OptionVisitor<T, U>(PhantomData<(T, U)>);
187
188        impl<'de, T, U> Visitor<'de> for OptionVisitor<T, U>
189        where
190            U: DeserializeAs<'de, T>,
191        {
192            type Value = Option<T>;
193
194            fn expecting(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
195                formatter.write_str("option")
196            }
197
198            #[inline]
199            fn visit_unit<E>(self) -> Result<Self::Value, E>
200            where
201                E: DeError,
202            {
203                Ok(None)
204            }
205
206            #[inline]
207            fn visit_none<E>(self) -> Result<Self::Value, E>
208            where
209                E: DeError,
210            {
211                Ok(None)
212            }
213
214            #[inline]
215            fn visit_some<D>(self, deserializer: D) -> Result<Self::Value, D::Error>
216            where
217                D: Deserializer<'de>,
218            {
219                U::deserialize_as(deserializer).map(Some)
220            }
221        }
222
223        deserializer.deserialize_option(OptionVisitor::<T, U>(PhantomData))
224    }
225}
226
227impl<'de, T, U> DeserializeAs<'de, Bound<T>> for Bound<U>
228where
229    U: DeserializeAs<'de, T>,
230{
231    fn deserialize_as<D>(deserializer: D) -> Result<Bound<T>, D::Error>
232    where
233        D: Deserializer<'de>,
234    {
235        Ok(
236            match Bound::<DeserializeAsWrap<T, U>>::deserialize(deserializer)? {
237                Bound::Unbounded => Bound::Unbounded,
238                Bound::Included(v) => Bound::Included(v.into_inner()),
239                Bound::Excluded(v) => Bound::Excluded(v.into_inner()),
240            },
241        )
242    }
243}
244
245#[cfg(feature = "alloc")]
246impl<'de, T, U> DeserializeAs<'de, Rc<T>> for Rc<U>
247where
248    U: DeserializeAs<'de, T>,
249{
250    fn deserialize_as<D>(deserializer: D) -> Result<Rc<T>, D::Error>
251    where
252        D: Deserializer<'de>,
253    {
254        Ok(Rc::new(
255            DeserializeAsWrap::<T, U>::deserialize(deserializer)?.into_inner(),
256        ))
257    }
258}
259
260#[cfg(feature = "alloc")]
261impl<'de, T, U> DeserializeAs<'de, Pin<Rc<T>>> for Pin<Rc<U>> where
    U: DeserializeAs<'de, T> {
    fn deserialize_as<D>(deserializer: D) -> Result<Pin<Rc<T>>, D::Error>
        where D: Deserializer<'de> {
        Ok(Rc::pin(DeserializeAsWrap::<T,
                                U>::deserialize(deserializer)?.into_inner()))
    }
}pinned_wrapper!(Rc);
262
263#[cfg(feature = "alloc")]
264impl<'de, T, U> DeserializeAs<'de, RcWeak<T>> for RcWeak<U>
265where
266    U: DeserializeAs<'de, T>,
267{
268    fn deserialize_as<D>(deserializer: D) -> Result<RcWeak<T>, D::Error>
269    where
270        D: Deserializer<'de>,
271    {
272        DeserializeAsWrap::<Option<Rc<T>>, Option<Rc<U>>>::deserialize(deserializer)?;
273        Ok(RcWeak::new())
274    }
275}
276
277#[cfg(all(feature = "alloc", target_has_atomic = "ptr"))]
278impl<'de, T, U> DeserializeAs<'de, Arc<T>> for Arc<U>
279where
280    U: DeserializeAs<'de, T>,
281{
282    fn deserialize_as<D>(deserializer: D) -> Result<Arc<T>, D::Error>
283    where
284        D: Deserializer<'de>,
285    {
286        Ok(Arc::new(
287            DeserializeAsWrap::<T, U>::deserialize(deserializer)?.into_inner(),
288        ))
289    }
290}
291
292#[cfg(all(feature = "alloc", target_has_atomic = "ptr"))]
293impl<'de, T, U> DeserializeAs<'de, Pin<Arc<T>>> for Pin<Arc<U>> where
    U: DeserializeAs<'de, T> {
    fn deserialize_as<D>(deserializer: D) -> Result<Pin<Arc<T>>, D::Error>
        where D: Deserializer<'de> {
        Ok(Arc::pin(DeserializeAsWrap::<T,
                                U>::deserialize(deserializer)?.into_inner()))
    }
}pinned_wrapper!(Arc);
294
295#[cfg(all(feature = "alloc", target_has_atomic = "ptr"))]
296impl<'de, T, U> DeserializeAs<'de, ArcWeak<T>> for ArcWeak<U>
297where
298    U: DeserializeAs<'de, T>,
299{
300    fn deserialize_as<D>(deserializer: D) -> Result<ArcWeak<T>, D::Error>
301    where
302        D: Deserializer<'de>,
303    {
304        DeserializeAsWrap::<Option<Arc<T>>, Option<Arc<U>>>::deserialize(deserializer)?;
305        Ok(ArcWeak::new())
306    }
307}
308
309impl<'de, T, U> DeserializeAs<'de, Cell<T>> for Cell<U>
310where
311    U: DeserializeAs<'de, T>,
312{
313    fn deserialize_as<D>(deserializer: D) -> Result<Cell<T>, D::Error>
314    where
315        D: Deserializer<'de>,
316    {
317        Ok(Cell::new(
318            DeserializeAsWrap::<T, U>::deserialize(deserializer)?.into_inner(),
319        ))
320    }
321}
322
323impl<'de, T, U> DeserializeAs<'de, RefCell<T>> for RefCell<U>
324where
325    U: DeserializeAs<'de, T>,
326{
327    fn deserialize_as<D>(deserializer: D) -> Result<RefCell<T>, D::Error>
328    where
329        D: Deserializer<'de>,
330    {
331        Ok(RefCell::new(
332            DeserializeAsWrap::<T, U>::deserialize(deserializer)?.into_inner(),
333        ))
334    }
335}
336
337#[cfg(feature = "std")]
338impl<'de, T, U> DeserializeAs<'de, Mutex<T>> for Mutex<U>
339where
340    U: DeserializeAs<'de, T>,
341{
342    fn deserialize_as<D>(deserializer: D) -> Result<Mutex<T>, D::Error>
343    where
344        D: Deserializer<'de>,
345    {
346        Ok(Mutex::new(
347            DeserializeAsWrap::<T, U>::deserialize(deserializer)?.into_inner(),
348        ))
349    }
350}
351
352#[cfg(feature = "std")]
353impl<'de, T, U> DeserializeAs<'de, RwLock<T>> for RwLock<U>
354where
355    U: DeserializeAs<'de, T>,
356{
357    fn deserialize_as<D>(deserializer: D) -> Result<RwLock<T>, D::Error>
358    where
359        D: Deserializer<'de>,
360    {
361        Ok(RwLock::new(
362            DeserializeAsWrap::<T, U>::deserialize(deserializer)?.into_inner(),
363        ))
364    }
365}
366
367impl<'de, T, TAs, E, EAs> DeserializeAs<'de, Result<T, E>> for Result<TAs, EAs>
368where
369    TAs: DeserializeAs<'de, T>,
370    EAs: DeserializeAs<'de, E>,
371{
372    fn deserialize_as<D>(deserializer: D) -> Result<Result<T, E>, D::Error>
373    where
374        D: Deserializer<'de>,
375    {
376        Ok(
377            match Result::<DeserializeAsWrap<T, TAs>, DeserializeAsWrap<E, EAs>>::deserialize(
378                deserializer,
379            )? {
380                Ok(value) => Ok(value.into_inner()),
381                Err(err) => Err(err.into_inner()),
382            },
383        )
384    }
385}
386
387impl<'de, T, As, const N: usize> DeserializeAs<'de, [T; N]> for [As; N]
388where
389    As: DeserializeAs<'de, T>,
390{
391    fn deserialize_as<D>(deserializer: D) -> Result<[T; N], D::Error>
392    where
393        D: Deserializer<'de>,
394    {
395        struct ArrayVisitor<T, const M: usize>(PhantomData<T>);
396
397        impl<'de, T, As, const M: usize> Visitor<'de> for ArrayVisitor<DeserializeAsWrap<T, As>, M>
398        where
399            As: DeserializeAs<'de, T>,
400        {
401            type Value = [T; M];
402
403            fn expecting(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
404                formatter.write_fmt(format_args!("an array of size {0}", M)format_args!("an array of size {M}"))
405            }
406
407            fn visit_seq<A>(self, seq: A) -> Result<Self::Value, A::Error>
408            where
409                A: SeqAccess<'de>,
410            {
411                utils::array_from_iterator(
412                    utils::SeqIter::new(seq).map(
413                        |res: Result<DeserializeAsWrap<T, As>, A::Error>| {
414                            res.map(DeserializeAsWrap::into_inner)
415                        },
416                    ),
417                    &self,
418                )
419            }
420        }
421
422        deserializer.deserialize_tuple(N, ArrayVisitor::<DeserializeAsWrap<T, As>, N>(PhantomData))
423    }
424}
425
426// endregion
427///////////////////////////////////////////////////////////////////////////////
428// region: More complex wrappers that are not just a single value
429
430impl<'de, Idx, IdxAs> DeserializeAs<'de, Range<Idx>> for Range<IdxAs>
431where
432    IdxAs: DeserializeAs<'de, Idx>,
433{
434    fn deserialize_as<D>(deserializer: D) -> Result<Range<Idx>, D::Error>
435    where
436        D: Deserializer<'de>,
437    {
438        let Range::<DeserializeAsWrap<Idx, IdxAs>> { start, end } =
439            Deserialize::deserialize(deserializer)?;
440
441        Ok(Range {
442            start: start.into_inner(),
443            end: end.into_inner(),
444        })
445    }
446}
447
448impl<'de, Idx, IdxAs> DeserializeAs<'de, RangeFrom<Idx>> for RangeFrom<IdxAs>
449where
450    IdxAs: DeserializeAs<'de, Idx>,
451{
452    fn deserialize_as<D>(deserializer: D) -> Result<RangeFrom<Idx>, D::Error>
453    where
454        D: Deserializer<'de>,
455    {
456        let RangeFrom::<DeserializeAsWrap<Idx, IdxAs>> { start } =
457            Deserialize::deserialize(deserializer)?;
458
459        Ok(RangeFrom {
460            start: start.into_inner(),
461        })
462    }
463}
464
465impl<'de, Idx, IdxAs> DeserializeAs<'de, RangeInclusive<Idx>> for RangeInclusive<IdxAs>
466where
467    IdxAs: DeserializeAs<'de, Idx>,
468{
469    fn deserialize_as<D>(deserializer: D) -> Result<RangeInclusive<Idx>, D::Error>
470    where
471        D: Deserializer<'de>,
472    {
473        let (start, end) =
474            RangeInclusive::<DeserializeAsWrap<Idx, IdxAs>>::deserialize(deserializer)?
475                .into_inner();
476
477        Ok(RangeInclusive::new(start.into_inner(), end.into_inner()))
478    }
479}
480
481impl<'de, Idx, IdxAs> DeserializeAs<'de, RangeTo<Idx>> for RangeTo<IdxAs>
482where
483    IdxAs: DeserializeAs<'de, Idx>,
484{
485    fn deserialize_as<D>(deserializer: D) -> Result<RangeTo<Idx>, D::Error>
486    where
487        D: Deserializer<'de>,
488    {
489        let RangeTo::<DeserializeAsWrap<Idx, IdxAs>> { end } =
490            Deserialize::deserialize(deserializer)?;
491
492        Ok(RangeTo {
493            end: end.into_inner(),
494        })
495    }
496}
497
498// endregion
499///////////////////////////////////////////////////////////////////////////////
500// region: Collection Types (e.g., Maps, Sets, Vec)
501
502#[cfg(feature = "alloc")]
503macro_rules! seq_impl {
504    (
505        $ty:ident < T $(: $tbound1:ident $(+ $tbound2:ident)*)? $(, $typaram:ident : $bound1:ident $(+ $bound2:ident)* )* >,
506        $with_capacity:expr,
507        $append:ident
508    ) => {
509        impl<'de, T, U $(, $typaram)*> DeserializeAs<'de, $ty<T $(, $typaram)*>> for $ty<U $(, $typaram)*>
510        where
511            U: DeserializeAs<'de, T>,
512            $(T: $tbound1 $(+ $tbound2)*,)?
513            $($typaram: $bound1 $(+ $bound2)*),*
514        {
515            fn deserialize_as<D>(deserializer: D) -> Result<$ty<T $(, $typaram)*>, D::Error>
516            where
517                D: Deserializer<'de>,
518            {
519                struct SeqVisitor<T, U $(, $typaram)*> {
520                    marker: PhantomData<(T, U $(, $typaram)*)>,
521                }
522
523                impl<'de, T, U $(, $typaram)*> Visitor<'de> for SeqVisitor<T, U $(, $typaram)*>
524                where
525                    U: DeserializeAs<'de, T>,
526                    $(T: $tbound1 $(+ $tbound2)*,)?
527                    $($typaram: $bound1 $(+ $bound2)*),*
528                {
529                    type Value = $ty<T $(, $typaram)*>;
530
531                    fn expecting(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
532                        formatter.write_str("a sequence")
533                    }
534
535                    fn visit_seq<A>(self, mut seq: A) -> Result<Self::Value, A::Error>
536                    where
537                        A: SeqAccess<'de>,
538                    {
539                        #[allow(clippy::redundant_closure_call)]
540                        let mut values = ($with_capacity)(utils::size_hint_cautious::<T>(seq.size_hint()));
541
542                        while let Some(value) = seq
543                            .next_element()?
544                            .map(|v: DeserializeAsWrap<T, U>| v.into_inner())
545                        {
546                            values.$append(value);
547                        }
548
549                        Ok(values.into())
550                    }
551                }
552
553                let visitor = SeqVisitor::<T, U $(, $typaram)*> {
554                    marker: PhantomData,
555                };
556                deserializer.deserialize_seq(visitor)
557            }
558        }
559    };
560}
561impl<'de, T, U> DeserializeAs<'de, VecDeque<T>> for VecDeque<U> where
    U: DeserializeAs<'de, T> {
    fn deserialize_as<D>(deserializer: D) -> Result<VecDeque<T>, D::Error>
        where D: Deserializer<'de> {
        struct SeqVisitor<T, U> {
            marker: PhantomData<(T, U)>,
        }
        impl<'de, T, U> Visitor<'de> for SeqVisitor<T, U> where
            U: DeserializeAs<'de, T> {
            type Value = VecDeque<T>;
            fn expecting(&self, formatter: &mut fmt::Formatter<'_>)
                -> fmt::Result {
                formatter.write_str("a sequence")
            }
            fn visit_seq<A>(self, mut seq: A) -> Result<Self::Value, A::Error>
                where A: SeqAccess<'de> {
                #[allow(clippy :: redundant_closure_call)]
                let mut values =
                    ((|size|
                                    VecDeque::with_capacity(size)))(utils::size_hint_cautious::<T>(seq.size_hint()));
                while let Some(value) =
                        seq.next_element()?.map(|v: DeserializeAsWrap<T, U>|
                                v.into_inner()) {
                    values.push_back(value);
                }
                Ok(values.into())
            }
        }
        let visitor = SeqVisitor::<T, U> { marker: PhantomData };
        deserializer.deserialize_seq(visitor)
    }
}foreach_seq!(seq_impl);
562
563// SmallVec implementation
564#[cfg(feature = "smallvec_1")]
565impl<'de, A, B> DeserializeAs<'de, SmallVec<A>> for SmallVec<B>
566where
567    A: smallvec_1::Array,
568    B: smallvec_1::Array,
569    B::Item: DeserializeAs<'de, A::Item>,
570{
571    fn deserialize_as<D>(deserializer: D) -> Result<SmallVec<A>, D::Error>
572    where
573        D: Deserializer<'de>,
574    {
575        struct SmallVecVisitor<A, B> {
576            marker: PhantomData<(A, B)>,
577        }
578
579        impl<'de, A, B> Visitor<'de> for SmallVecVisitor<A, B>
580        where
581            A: smallvec_1::Array,
582            B: smallvec_1::Array,
583            B::Item: DeserializeAs<'de, A::Item>,
584        {
585            type Value = SmallVec<A>;
586
587            fn expecting(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
588                formatter.write_str("a sequence")
589            }
590
591            fn visit_seq<S>(self, mut seq: S) -> Result<Self::Value, S::Error>
592            where
593                S: SeqAccess<'de>,
594            {
595                let mut values = SmallVec::new();
596
597                while let Some(value) = seq
598                    .next_element()?
599                    .map(|v: DeserializeAsWrap<A::Item, B::Item>| v.into_inner())
600                {
601                    values.push(value);
602                }
603
604                Ok(values)
605            }
606        }
607
608        let visitor = SmallVecVisitor::<A, B> {
609            marker: PhantomData,
610        };
611        deserializer.deserialize_seq(visitor)
612    }
613}
614
615#[cfg(feature = "alloc")]
616macro_rules! map_impl {
617    (
618        $ty:ident < K $(: $kbound1:ident $(+ $kbound2:ident)*)*, V $(, $typaram:ident : $bound1:ident $(+ $bound2:ident)*)* >,
619        $with_capacity:expr
620    ) => {
621        impl<'de, K, V, KU, VU $(, $typaram)*> DeserializeAs<'de, $ty<K, V $(, $typaram)*>> for $ty<KU, VU $(, $typaram)*>
622        where
623            KU: DeserializeAs<'de, K>,
624            VU: DeserializeAs<'de, V>,
625            $(K: $kbound1 $(+ $kbound2)*,)*
626            $($typaram: $bound1 $(+ $bound2)*),*
627        {
628            fn deserialize_as<D>(deserializer: D) -> Result<$ty<K, V $(, $typaram)*>, D::Error>
629            where
630                D: Deserializer<'de>,
631            {
632                struct MapVisitor<K, V, KU, VU $(, $typaram)*>(PhantomData<(K, V, KU, VU $(, $typaram)*)>);
633
634                impl<'de, K, V, KU, VU $(, $typaram)*> Visitor<'de> for MapVisitor<K, V, KU, VU $(, $typaram)*>
635                where
636                        KU: DeserializeAs<'de, K>,
637                        VU: DeserializeAs<'de, V>,
638                        $(K: $kbound1 $(+ $kbound2)*,)*
639                        $($typaram: $bound1 $(+ $bound2)*),*
640                {
641                    type Value = $ty<K, V $(, $typaram)*>;
642
643                    fn expecting(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
644                        formatter.write_str("a map")
645                    }
646
647                    #[inline]
648                    fn visit_map<A>(self, mut map: A) -> Result<Self::Value, A::Error>
649                    where
650                        A: MapAccess<'de>,
651                    {
652                        #[allow(clippy::redundant_closure_call)]
653                        let mut values = ($with_capacity)(utils::size_hint_cautious::<(K, V)>(map.size_hint()));
654
655                        while let Some((key, value)) = (map.next_entry())?.map(|(k, v): (DeserializeAsWrap::<K, KU>, DeserializeAsWrap::<V, VU>)| (k.into_inner(), v.into_inner())) {
656                            values.insert(key, value);
657                        }
658
659                        Ok(values)
660                    }
661                }
662
663                let visitor = MapVisitor::<K, V, KU, VU $(, $typaram)*> (PhantomData);
664                deserializer.deserialize_map(visitor)
665            }
666        }
667    }
668}
669impl<'de, K, V, KU, VU, S> DeserializeAs<'de, IndexMap2<K, V, S>> for
    IndexMap2<KU, VU, S> where KU: DeserializeAs<'de, K>,
    VU: DeserializeAs<'de, V>, K: Eq + Hash, S: BuildHasher + Default {
    fn deserialize_as<D>(deserializer: D)
        -> Result<IndexMap2<K, V, S>, D::Error> where D: Deserializer<'de> {
        struct MapVisitor<K, V, KU, VU, S>(PhantomData<(K, V, KU, VU, S)>);
        impl<'de, K, V, KU, VU, S> Visitor<'de> for
            MapVisitor<K, V, KU, VU, S> where KU: DeserializeAs<'de, K>,
            VU: DeserializeAs<'de, V>, K: Eq + Hash, S: BuildHasher + Default
            {
            type Value = IndexMap2<K, V, S>;
            fn expecting(&self, formatter: &mut fmt::Formatter<'_>)
                -> fmt::Result {
                formatter.write_str("a map")
            }
            #[inline]
            fn visit_map<A>(self, mut map: A) -> Result<Self::Value, A::Error>
                where A: MapAccess<'de> {
                #[allow(clippy :: redundant_closure_call)]
                let mut values =
                    ((|size|
                                    IndexMap2::with_capacity_and_hasher(size,
                                        Default::default())))(utils::size_hint_cautious::<(K,
                                V)>(map.size_hint()));
                while let Some((key, value)) =
                        (map.next_entry())?.map(|(k, v):
                                    (DeserializeAsWrap<K, KU>, DeserializeAsWrap<V, VU>)|
                                (k.into_inner(), v.into_inner())) {
                    values.insert(key, value);
                }
                Ok(values)
            }
        }
        let visitor = MapVisitor::<K, V, KU, VU, S>(PhantomData);
        deserializer.deserialize_map(visitor)
    }
}foreach_map!(map_impl);
670
671macro_rules! tuple_impl {
672    ($len:literal $($n:tt $t:ident $tas:ident)+) => {
673        impl<'de, $($t, $tas,)+> DeserializeAs<'de, ($($t,)+)> for ($($tas,)+)
674        where
675            $($tas: DeserializeAs<'de, $t>,)+
676        {
677            fn deserialize_as<D>(deserializer: D) -> Result<($($t,)+), D::Error>
678            where
679                D: Deserializer<'de>,
680            {
681                struct TupleVisitor<$($t,)+>(PhantomData<($($t,)+)>);
682
683                impl<'de, $($t, $tas,)+> Visitor<'de>
684                    for TupleVisitor<$(DeserializeAsWrap<$t, $tas>,)+>
685                where
686                    $($tas: DeserializeAs<'de, $t>,)+
687                {
688                    type Value = ($($t,)+);
689
690                    fn expecting(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
691                        formatter.write_str(concat!("a tuple of size ", $len))
692                    }
693
694                    #[allow(non_snake_case)]
695                    fn visit_seq<A>(self, mut seq: A) -> Result<Self::Value, A::Error>
696                    where
697                        A: SeqAccess<'de>,
698                    {
699                        $(
700                            let $t: DeserializeAsWrap<$t, $tas> = match seq.next_element()? {
701                                Some(value) => value,
702                                None => return Err(DeError::invalid_length($n, &self)),
703                            };
704                        )+
705
706                        Ok(($($t.into_inner(),)+))
707                    }
708                }
709
710                deserializer.deserialize_tuple(
711                    $len,
712                    TupleVisitor::<$(DeserializeAsWrap<$t, $tas>,)+>(PhantomData),
713                )
714            }
715        }
716    };
717}
718
719impl<'de, T0, As0> DeserializeAs<'de, (T0,)> for (As0,) where
    As0: DeserializeAs<'de, T0> {
    fn deserialize_as<D>(deserializer: D) -> Result<(T0,), D::Error> where
        D: Deserializer<'de> {
        struct TupleVisitor<T0>(PhantomData<(T0,)>);
        impl<'de, T0, As0> Visitor<'de> for
            TupleVisitor<DeserializeAsWrap<T0, As0>> where
            As0: DeserializeAs<'de, T0> {
            type Value = (T0,);
            fn expecting(&self, formatter: &mut fmt::Formatter<'_>)
                -> fmt::Result {
                formatter.write_str("a tuple of size 1")
            }
            #[allow(non_snake_case)]
            fn visit_seq<A>(self, mut seq: A) -> Result<Self::Value, A::Error>
                where A: SeqAccess<'de> {
                let T0: DeserializeAsWrap<T0, As0> =
                    match seq.next_element()? {
                        Some(value) => value,
                        None => return Err(DeError::invalid_length(0, &self)),
                    };
                Ok((T0.into_inner(),))
            }
        }
        deserializer.deserialize_tuple(1,
            TupleVisitor::<DeserializeAsWrap<T0, As0>>(PhantomData))
    }
}tuple_impl!(1 0 T0 As0);
720impl<'de, T0, As0, T1, As1> DeserializeAs<'de, (T0, T1)> for (As0, As1) where
    As0: DeserializeAs<'de, T0>, As1: DeserializeAs<'de, T1> {
    fn deserialize_as<D>(deserializer: D) -> Result<(T0, T1), D::Error> where
        D: Deserializer<'de> {
        struct TupleVisitor<T0, T1>(PhantomData<(T0, T1)>);
        impl<'de, T0, As0, T1, As1> Visitor<'de> for
            TupleVisitor<DeserializeAsWrap<T0, As0>,
            DeserializeAsWrap<T1, As1>> where As0: DeserializeAs<'de, T0>,
            As1: DeserializeAs<'de, T1> {
            type Value = (T0, T1);
            fn expecting(&self, formatter: &mut fmt::Formatter<'_>)
                -> fmt::Result {
                formatter.write_str("a tuple of size 2")
            }
            #[allow(non_snake_case)]
            fn visit_seq<A>(self, mut seq: A) -> Result<Self::Value, A::Error>
                where A: SeqAccess<'de> {
                let T0: DeserializeAsWrap<T0, As0> =
                    match seq.next_element()? {
                        Some(value) => value,
                        None => return Err(DeError::invalid_length(0, &self)),
                    };
                let T1: DeserializeAsWrap<T1, As1> =
                    match seq.next_element()? {
                        Some(value) => value,
                        None => return Err(DeError::invalid_length(1, &self)),
                    };
                Ok((T0.into_inner(), T1.into_inner()))
            }
        }
        deserializer.deserialize_tuple(2,
            TupleVisitor::<DeserializeAsWrap<T0, As0>,
                    DeserializeAsWrap<T1, As1>>(PhantomData))
    }
}tuple_impl!(2 0 T0 As0 1 T1 As1);
721impl<'de, T0, As0, T1, As1, T2, As2> DeserializeAs<'de, (T0, T1, T2)> for
    (As0, As1, As2) where As0: DeserializeAs<'de, T0>,
    As1: DeserializeAs<'de, T1>, As2: DeserializeAs<'de, T2> {
    fn deserialize_as<D>(deserializer: D) -> Result<(T0, T1, T2), D::Error>
        where D: Deserializer<'de> {
        struct TupleVisitor<T0, T1, T2>(PhantomData<(T0, T1, T2)>);
        impl<'de, T0, As0, T1, As1, T2, As2> Visitor<'de> for
            TupleVisitor<DeserializeAsWrap<T0, As0>,
            DeserializeAsWrap<T1, As1>, DeserializeAsWrap<T2, As2>> where
            As0: DeserializeAs<'de, T0>, As1: DeserializeAs<'de, T1>,
            As2: DeserializeAs<'de, T2> {
            type Value = (T0, T1, T2);
            fn expecting(&self, formatter: &mut fmt::Formatter<'_>)
                -> fmt::Result {
                formatter.write_str("a tuple of size 3")
            }
            #[allow(non_snake_case)]
            fn visit_seq<A>(self, mut seq: A) -> Result<Self::Value, A::Error>
                where A: SeqAccess<'de> {
                let T0: DeserializeAsWrap<T0, As0> =
                    match seq.next_element()? {
                        Some(value) => value,
                        None => return Err(DeError::invalid_length(0, &self)),
                    };
                let T1: DeserializeAsWrap<T1, As1> =
                    match seq.next_element()? {
                        Some(value) => value,
                        None => return Err(DeError::invalid_length(1, &self)),
                    };
                let T2: DeserializeAsWrap<T2, As2> =
                    match seq.next_element()? {
                        Some(value) => value,
                        None => return Err(DeError::invalid_length(2, &self)),
                    };
                Ok((T0.into_inner(), T1.into_inner(), T2.into_inner()))
            }
        }
        deserializer.deserialize_tuple(3,
            TupleVisitor::<DeserializeAsWrap<T0, As0>,
                    DeserializeAsWrap<T1, As1>,
                    DeserializeAsWrap<T2, As2>>(PhantomData))
    }
}tuple_impl!(3 0 T0 As0 1 T1 As1 2 T2 As2);
722impl<'de, T0, As0, T1, As1, T2, As2, T3, As3>
    DeserializeAs<'de, (T0, T1, T2, T3)> for (As0, As1, As2, As3) where
    As0: DeserializeAs<'de, T0>, As1: DeserializeAs<'de, T1>,
    As2: DeserializeAs<'de, T2>, As3: DeserializeAs<'de, T3> {
    fn deserialize_as<D>(deserializer: D)
        -> Result<(T0, T1, T2, T3), D::Error> where D: Deserializer<'de> {
        struct TupleVisitor<T0, T1, T2, T3>(PhantomData<(T0, T1, T2, T3)>);
        impl<'de, T0, As0, T1, As1, T2, As2, T3, As3> Visitor<'de> for
            TupleVisitor<DeserializeAsWrap<T0, As0>,
            DeserializeAsWrap<T1, As1>, DeserializeAsWrap<T2, As2>,
            DeserializeAsWrap<T3, As3>> where As0: DeserializeAs<'de, T0>,
            As1: DeserializeAs<'de, T1>, As2: DeserializeAs<'de, T2>,
            As3: DeserializeAs<'de, T3> {
            type Value = (T0, T1, T2, T3);
            fn expecting(&self, formatter: &mut fmt::Formatter<'_>)
                -> fmt::Result {
                formatter.write_str("a tuple of size 4")
            }
            #[allow(non_snake_case)]
            fn visit_seq<A>(self, mut seq: A) -> Result<Self::Value, A::Error>
                where A: SeqAccess<'de> {
                let T0: DeserializeAsWrap<T0, As0> =
                    match seq.next_element()? {
                        Some(value) => value,
                        None => return Err(DeError::invalid_length(0, &self)),
                    };
                let T1: DeserializeAsWrap<T1, As1> =
                    match seq.next_element()? {
                        Some(value) => value,
                        None => return Err(DeError::invalid_length(1, &self)),
                    };
                let T2: DeserializeAsWrap<T2, As2> =
                    match seq.next_element()? {
                        Some(value) => value,
                        None => return Err(DeError::invalid_length(2, &self)),
                    };
                let T3: DeserializeAsWrap<T3, As3> =
                    match seq.next_element()? {
                        Some(value) => value,
                        None => return Err(DeError::invalid_length(3, &self)),
                    };
                Ok((T0.into_inner(), T1.into_inner(), T2.into_inner(),
                        T3.into_inner()))
            }
        }
        deserializer.deserialize_tuple(4,
            TupleVisitor::<DeserializeAsWrap<T0, As0>,
                    DeserializeAsWrap<T1, As1>, DeserializeAsWrap<T2, As2>,
                    DeserializeAsWrap<T3, As3>>(PhantomData))
    }
}tuple_impl!(4 0 T0 As0 1 T1 As1 2 T2 As2 3 T3 As3);
723impl<'de, T0, As0, T1, As1, T2, As2, T3, As3, T4, As4>
    DeserializeAs<'de, (T0, T1, T2, T3, T4)> for (As0, As1, As2, As3, As4)
    where As0: DeserializeAs<'de, T0>, As1: DeserializeAs<'de, T1>,
    As2: DeserializeAs<'de, T2>, As3: DeserializeAs<'de, T3>,
    As4: DeserializeAs<'de, T4> {
    fn deserialize_as<D>(deserializer: D)
        -> Result<(T0, T1, T2, T3, T4), D::Error> where D: Deserializer<'de> {
        struct TupleVisitor<T0, T1, T2, T3,
            T4>(PhantomData<(T0, T1, T2, T3, T4)>);
        impl<'de, T0, As0, T1, As1, T2, As2, T3, As3, T4, As4> Visitor<'de>
            for
            TupleVisitor<DeserializeAsWrap<T0, As0>,
            DeserializeAsWrap<T1, As1>, DeserializeAsWrap<T2, As2>,
            DeserializeAsWrap<T3, As3>, DeserializeAsWrap<T4, As4>> where
            As0: DeserializeAs<'de, T0>, As1: DeserializeAs<'de, T1>,
            As2: DeserializeAs<'de, T2>, As3: DeserializeAs<'de, T3>,
            As4: DeserializeAs<'de, T4> {
            type Value = (T0, T1, T2, T3, T4);
            fn expecting(&self, formatter: &mut fmt::Formatter<'_>)
                -> fmt::Result {
                formatter.write_str("a tuple of size 5")
            }
            #[allow(non_snake_case)]
            fn visit_seq<A>(self, mut seq: A) -> Result<Self::Value, A::Error>
                where A: SeqAccess<'de> {
                let T0: DeserializeAsWrap<T0, As0> =
                    match seq.next_element()? {
                        Some(value) => value,
                        None => return Err(DeError::invalid_length(0, &self)),
                    };
                let T1: DeserializeAsWrap<T1, As1> =
                    match seq.next_element()? {
                        Some(value) => value,
                        None => return Err(DeError::invalid_length(1, &self)),
                    };
                let T2: DeserializeAsWrap<T2, As2> =
                    match seq.next_element()? {
                        Some(value) => value,
                        None => return Err(DeError::invalid_length(2, &self)),
                    };
                let T3: DeserializeAsWrap<T3, As3> =
                    match seq.next_element()? {
                        Some(value) => value,
                        None => return Err(DeError::invalid_length(3, &self)),
                    };
                let T4: DeserializeAsWrap<T4, As4> =
                    match seq.next_element()? {
                        Some(value) => value,
                        None => return Err(DeError::invalid_length(4, &self)),
                    };
                Ok((T0.into_inner(), T1.into_inner(), T2.into_inner(),
                        T3.into_inner(), T4.into_inner()))
            }
        }
        deserializer.deserialize_tuple(5,
            TupleVisitor::<DeserializeAsWrap<T0, As0>,
                    DeserializeAsWrap<T1, As1>, DeserializeAsWrap<T2, As2>,
                    DeserializeAsWrap<T3, As3>,
                    DeserializeAsWrap<T4, As4>>(PhantomData))
    }
}tuple_impl!(5 0 T0 As0 1 T1 As1 2 T2 As2 3 T3 As3 4 T4 As4);
724impl<'de, T0, As0, T1, As1, T2, As2, T3, As3, T4, As4, T5, As5>
    DeserializeAs<'de, (T0, T1, T2, T3, T4, T5)> for
    (As0, As1, As2, As3, As4, As5) where As0: DeserializeAs<'de, T0>,
    As1: DeserializeAs<'de, T1>, As2: DeserializeAs<'de, T2>,
    As3: DeserializeAs<'de, T3>, As4: DeserializeAs<'de, T4>,
    As5: DeserializeAs<'de, T5> {
    fn deserialize_as<D>(deserializer: D)
        -> Result<(T0, T1, T2, T3, T4, T5), D::Error> where
        D: Deserializer<'de> {
        struct TupleVisitor<T0, T1, T2, T3, T4,
            T5>(PhantomData<(T0, T1, T2, T3, T4, T5)>);
        impl<'de, T0, As0, T1, As1, T2, As2, T3, As3, T4, As4, T5, As5>
            Visitor<'de> for
            TupleVisitor<DeserializeAsWrap<T0, As0>,
            DeserializeAsWrap<T1, As1>, DeserializeAsWrap<T2, As2>,
            DeserializeAsWrap<T3, As3>, DeserializeAsWrap<T4, As4>,
            DeserializeAsWrap<T5, As5>> where As0: DeserializeAs<'de, T0>,
            As1: DeserializeAs<'de, T1>, As2: DeserializeAs<'de, T2>,
            As3: DeserializeAs<'de, T3>, As4: DeserializeAs<'de, T4>,
            As5: DeserializeAs<'de, T5> {
            type Value = (T0, T1, T2, T3, T4, T5);
            fn expecting(&self, formatter: &mut fmt::Formatter<'_>)
                -> fmt::Result {
                formatter.write_str("a tuple of size 6")
            }
            #[allow(non_snake_case)]
            fn visit_seq<A>(self, mut seq: A) -> Result<Self::Value, A::Error>
                where A: SeqAccess<'de> {
                let T0: DeserializeAsWrap<T0, As0> =
                    match seq.next_element()? {
                        Some(value) => value,
                        None => return Err(DeError::invalid_length(0, &self)),
                    };
                let T1: DeserializeAsWrap<T1, As1> =
                    match seq.next_element()? {
                        Some(value) => value,
                        None => return Err(DeError::invalid_length(1, &self)),
                    };
                let T2: DeserializeAsWrap<T2, As2> =
                    match seq.next_element()? {
                        Some(value) => value,
                        None => return Err(DeError::invalid_length(2, &self)),
                    };
                let T3: DeserializeAsWrap<T3, As3> =
                    match seq.next_element()? {
                        Some(value) => value,
                        None => return Err(DeError::invalid_length(3, &self)),
                    };
                let T4: DeserializeAsWrap<T4, As4> =
                    match seq.next_element()? {
                        Some(value) => value,
                        None => return Err(DeError::invalid_length(4, &self)),
                    };
                let T5: DeserializeAsWrap<T5, As5> =
                    match seq.next_element()? {
                        Some(value) => value,
                        None => return Err(DeError::invalid_length(5, &self)),
                    };
                Ok((T0.into_inner(), T1.into_inner(), T2.into_inner(),
                        T3.into_inner(), T4.into_inner(), T5.into_inner()))
            }
        }
        deserializer.deserialize_tuple(6,
            TupleVisitor::<DeserializeAsWrap<T0, As0>,
                    DeserializeAsWrap<T1, As1>, DeserializeAsWrap<T2, As2>,
                    DeserializeAsWrap<T3, As3>, DeserializeAsWrap<T4, As4>,
                    DeserializeAsWrap<T5, As5>>(PhantomData))
    }
}tuple_impl!(6 0 T0 As0 1 T1 As1 2 T2 As2 3 T3 As3 4 T4 As4 5 T5 As5);
725impl<'de, T0, As0, T1, As1, T2, As2, T3, As3, T4, As4, T5, As5, T6, As6>
    DeserializeAs<'de, (T0, T1, T2, T3, T4, T5, T6)> for
    (As0, As1, As2, As3, As4, As5, As6) where As0: DeserializeAs<'de, T0>,
    As1: DeserializeAs<'de, T1>, As2: DeserializeAs<'de, T2>,
    As3: DeserializeAs<'de, T3>, As4: DeserializeAs<'de, T4>,
    As5: DeserializeAs<'de, T5>, As6: DeserializeAs<'de, T6> {
    fn deserialize_as<D>(deserializer: D)
        -> Result<(T0, T1, T2, T3, T4, T5, T6), D::Error> where
        D: Deserializer<'de> {
        struct TupleVisitor<T0, T1, T2, T3, T4, T5,
            T6>(PhantomData<(T0, T1, T2, T3, T4, T5, T6)>);
        impl<'de, T0, As0, T1, As1, T2, As2, T3, As3, T4, As4, T5, As5, T6,
            As6> Visitor<'de> for
            TupleVisitor<DeserializeAsWrap<T0, As0>,
            DeserializeAsWrap<T1, As1>, DeserializeAsWrap<T2, As2>,
            DeserializeAsWrap<T3, As3>, DeserializeAsWrap<T4, As4>,
            DeserializeAsWrap<T5, As5>, DeserializeAsWrap<T6, As6>> where
            As0: DeserializeAs<'de, T0>, As1: DeserializeAs<'de, T1>,
            As2: DeserializeAs<'de, T2>, As3: DeserializeAs<'de, T3>,
            As4: DeserializeAs<'de, T4>, As5: DeserializeAs<'de, T5>,
            As6: DeserializeAs<'de, T6> {
            type Value = (T0, T1, T2, T3, T4, T5, T6);
            fn expecting(&self, formatter: &mut fmt::Formatter<'_>)
                -> fmt::Result {
                formatter.write_str("a tuple of size 7")
            }
            #[allow(non_snake_case)]
            fn visit_seq<A>(self, mut seq: A) -> Result<Self::Value, A::Error>
                where A: SeqAccess<'de> {
                let T0: DeserializeAsWrap<T0, As0> =
                    match seq.next_element()? {
                        Some(value) => value,
                        None => return Err(DeError::invalid_length(0, &self)),
                    };
                let T1: DeserializeAsWrap<T1, As1> =
                    match seq.next_element()? {
                        Some(value) => value,
                        None => return Err(DeError::invalid_length(1, &self)),
                    };
                let T2: DeserializeAsWrap<T2, As2> =
                    match seq.next_element()? {
                        Some(value) => value,
                        None => return Err(DeError::invalid_length(2, &self)),
                    };
                let T3: DeserializeAsWrap<T3, As3> =
                    match seq.next_element()? {
                        Some(value) => value,
                        None => return Err(DeError::invalid_length(3, &self)),
                    };
                let T4: DeserializeAsWrap<T4, As4> =
                    match seq.next_element()? {
                        Some(value) => value,
                        None => return Err(DeError::invalid_length(4, &self)),
                    };
                let T5: DeserializeAsWrap<T5, As5> =
                    match seq.next_element()? {
                        Some(value) => value,
                        None => return Err(DeError::invalid_length(5, &self)),
                    };
                let T6: DeserializeAsWrap<T6, As6> =
                    match seq.next_element()? {
                        Some(value) => value,
                        None => return Err(DeError::invalid_length(6, &self)),
                    };
                Ok((T0.into_inner(), T1.into_inner(), T2.into_inner(),
                        T3.into_inner(), T4.into_inner(), T5.into_inner(),
                        T6.into_inner()))
            }
        }
        deserializer.deserialize_tuple(7,
            TupleVisitor::<DeserializeAsWrap<T0, As0>,
                    DeserializeAsWrap<T1, As1>, DeserializeAsWrap<T2, As2>,
                    DeserializeAsWrap<T3, As3>, DeserializeAsWrap<T4, As4>,
                    DeserializeAsWrap<T5, As5>,
                    DeserializeAsWrap<T6, As6>>(PhantomData))
    }
}tuple_impl!(7 0 T0 As0 1 T1 As1 2 T2 As2 3 T3 As3 4 T4 As4 5 T5 As5 6 T6 As6);
726impl<'de, T0, As0, T1, As1, T2, As2, T3, As3, T4, As4, T5, As5, T6, As6, T7,
    As7> DeserializeAs<'de, (T0, T1, T2, T3, T4, T5, T6, T7)> for
    (As0, As1, As2, As3, As4, As5, As6, As7) where
    As0: DeserializeAs<'de, T0>, As1: DeserializeAs<'de, T1>,
    As2: DeserializeAs<'de, T2>, As3: DeserializeAs<'de, T3>,
    As4: DeserializeAs<'de, T4>, As5: DeserializeAs<'de, T5>,
    As6: DeserializeAs<'de, T6>, As7: DeserializeAs<'de, T7> {
    fn deserialize_as<D>(deserializer: D)
        -> Result<(T0, T1, T2, T3, T4, T5, T6, T7), D::Error> where
        D: Deserializer<'de> {
        struct TupleVisitor<T0, T1, T2, T3, T4, T5, T6,
            T7>(PhantomData<(T0, T1, T2, T3, T4, T5, T6, T7)>);
        impl<'de, T0, As0, T1, As1, T2, As2, T3, As3, T4, As4, T5, As5, T6,
            As6, T7, As7> Visitor<'de> for
            TupleVisitor<DeserializeAsWrap<T0, As0>,
            DeserializeAsWrap<T1, As1>, DeserializeAsWrap<T2, As2>,
            DeserializeAsWrap<T3, As3>, DeserializeAsWrap<T4, As4>,
            DeserializeAsWrap<T5, As5>, DeserializeAsWrap<T6, As6>,
            DeserializeAsWrap<T7, As7>> where As0: DeserializeAs<'de, T0>,
            As1: DeserializeAs<'de, T1>, As2: DeserializeAs<'de, T2>,
            As3: DeserializeAs<'de, T3>, As4: DeserializeAs<'de, T4>,
            As5: DeserializeAs<'de, T5>, As6: DeserializeAs<'de, T6>,
            As7: DeserializeAs<'de, T7> {
            type Value = (T0, T1, T2, T3, T4, T5, T6, T7);
            fn expecting(&self, formatter: &mut fmt::Formatter<'_>)
                -> fmt::Result {
                formatter.write_str("a tuple of size 8")
            }
            #[allow(non_snake_case)]
            fn visit_seq<A>(self, mut seq: A) -> Result<Self::Value, A::Error>
                where A: SeqAccess<'de> {
                let T0: DeserializeAsWrap<T0, As0> =
                    match seq.next_element()? {
                        Some(value) => value,
                        None => return Err(DeError::invalid_length(0, &self)),
                    };
                let T1: DeserializeAsWrap<T1, As1> =
                    match seq.next_element()? {
                        Some(value) => value,
                        None => return Err(DeError::invalid_length(1, &self)),
                    };
                let T2: DeserializeAsWrap<T2, As2> =
                    match seq.next_element()? {
                        Some(value) => value,
                        None => return Err(DeError::invalid_length(2, &self)),
                    };
                let T3: DeserializeAsWrap<T3, As3> =
                    match seq.next_element()? {
                        Some(value) => value,
                        None => return Err(DeError::invalid_length(3, &self)),
                    };
                let T4: DeserializeAsWrap<T4, As4> =
                    match seq.next_element()? {
                        Some(value) => value,
                        None => return Err(DeError::invalid_length(4, &self)),
                    };
                let T5: DeserializeAsWrap<T5, As5> =
                    match seq.next_element()? {
                        Some(value) => value,
                        None => return Err(DeError::invalid_length(5, &self)),
                    };
                let T6: DeserializeAsWrap<T6, As6> =
                    match seq.next_element()? {
                        Some(value) => value,
                        None => return Err(DeError::invalid_length(6, &self)),
                    };
                let T7: DeserializeAsWrap<T7, As7> =
                    match seq.next_element()? {
                        Some(value) => value,
                        None => return Err(DeError::invalid_length(7, &self)),
                    };
                Ok((T0.into_inner(), T1.into_inner(), T2.into_inner(),
                        T3.into_inner(), T4.into_inner(), T5.into_inner(),
                        T6.into_inner(), T7.into_inner()))
            }
        }
        deserializer.deserialize_tuple(8,
            TupleVisitor::<DeserializeAsWrap<T0, As0>,
                    DeserializeAsWrap<T1, As1>, DeserializeAsWrap<T2, As2>,
                    DeserializeAsWrap<T3, As3>, DeserializeAsWrap<T4, As4>,
                    DeserializeAsWrap<T5, As5>, DeserializeAsWrap<T6, As6>,
                    DeserializeAsWrap<T7, As7>>(PhantomData))
    }
}tuple_impl!(8 0 T0 As0 1 T1 As1 2 T2 As2 3 T3 As3 4 T4 As4 5 T5 As5 6 T6 As6 7 T7 As7);
727impl<'de, T0, As0, T1, As1, T2, As2, T3, As3, T4, As4, T5, As5, T6, As6, T7,
    As7, T8, As8> DeserializeAs<'de, (T0, T1, T2, T3, T4, T5, T6, T7, T8)> for
    (As0, As1, As2, As3, As4, As5, As6, As7, As8) where
    As0: DeserializeAs<'de, T0>, As1: DeserializeAs<'de, T1>,
    As2: DeserializeAs<'de, T2>, As3: DeserializeAs<'de, T3>,
    As4: DeserializeAs<'de, T4>, As5: DeserializeAs<'de, T5>,
    As6: DeserializeAs<'de, T6>, As7: DeserializeAs<'de, T7>,
    As8: DeserializeAs<'de, T8> {
    fn deserialize_as<D>(deserializer: D)
        -> Result<(T0, T1, T2, T3, T4, T5, T6, T7, T8), D::Error> where
        D: Deserializer<'de> {
        struct TupleVisitor<T0, T1, T2, T3, T4, T5, T6, T7,
            T8>(PhantomData<(T0, T1, T2, T3, T4, T5, T6, T7, T8)>);
        impl<'de, T0, As0, T1, As1, T2, As2, T3, As3, T4, As4, T5, As5, T6,
            As6, T7, As7, T8, As8> Visitor<'de> for
            TupleVisitor<DeserializeAsWrap<T0, As0>,
            DeserializeAsWrap<T1, As1>, DeserializeAsWrap<T2, As2>,
            DeserializeAsWrap<T3, As3>, DeserializeAsWrap<T4, As4>,
            DeserializeAsWrap<T5, As5>, DeserializeAsWrap<T6, As6>,
            DeserializeAsWrap<T7, As7>, DeserializeAsWrap<T8, As8>> where
            As0: DeserializeAs<'de, T0>, As1: DeserializeAs<'de, T1>,
            As2: DeserializeAs<'de, T2>, As3: DeserializeAs<'de, T3>,
            As4: DeserializeAs<'de, T4>, As5: DeserializeAs<'de, T5>,
            As6: DeserializeAs<'de, T6>, As7: DeserializeAs<'de, T7>,
            As8: DeserializeAs<'de, T8> {
            type Value = (T0, T1, T2, T3, T4, T5, T6, T7, T8);
            fn expecting(&self, formatter: &mut fmt::Formatter<'_>)
                -> fmt::Result {
                formatter.write_str("a tuple of size 9")
            }
            #[allow(non_snake_case)]
            fn visit_seq<A>(self, mut seq: A) -> Result<Self::Value, A::Error>
                where A: SeqAccess<'de> {
                let T0: DeserializeAsWrap<T0, As0> =
                    match seq.next_element()? {
                        Some(value) => value,
                        None => return Err(DeError::invalid_length(0, &self)),
                    };
                let T1: DeserializeAsWrap<T1, As1> =
                    match seq.next_element()? {
                        Some(value) => value,
                        None => return Err(DeError::invalid_length(1, &self)),
                    };
                let T2: DeserializeAsWrap<T2, As2> =
                    match seq.next_element()? {
                        Some(value) => value,
                        None => return Err(DeError::invalid_length(2, &self)),
                    };
                let T3: DeserializeAsWrap<T3, As3> =
                    match seq.next_element()? {
                        Some(value) => value,
                        None => return Err(DeError::invalid_length(3, &self)),
                    };
                let T4: DeserializeAsWrap<T4, As4> =
                    match seq.next_element()? {
                        Some(value) => value,
                        None => return Err(DeError::invalid_length(4, &self)),
                    };
                let T5: DeserializeAsWrap<T5, As5> =
                    match seq.next_element()? {
                        Some(value) => value,
                        None => return Err(DeError::invalid_length(5, &self)),
                    };
                let T6: DeserializeAsWrap<T6, As6> =
                    match seq.next_element()? {
                        Some(value) => value,
                        None => return Err(DeError::invalid_length(6, &self)),
                    };
                let T7: DeserializeAsWrap<T7, As7> =
                    match seq.next_element()? {
                        Some(value) => value,
                        None => return Err(DeError::invalid_length(7, &self)),
                    };
                let T8: DeserializeAsWrap<T8, As8> =
                    match seq.next_element()? {
                        Some(value) => value,
                        None => return Err(DeError::invalid_length(8, &self)),
                    };
                Ok((T0.into_inner(), T1.into_inner(), T2.into_inner(),
                        T3.into_inner(), T4.into_inner(), T5.into_inner(),
                        T6.into_inner(), T7.into_inner(), T8.into_inner()))
            }
        }
        deserializer.deserialize_tuple(9,
            TupleVisitor::<DeserializeAsWrap<T0, As0>,
                    DeserializeAsWrap<T1, As1>, DeserializeAsWrap<T2, As2>,
                    DeserializeAsWrap<T3, As3>, DeserializeAsWrap<T4, As4>,
                    DeserializeAsWrap<T5, As5>, DeserializeAsWrap<T6, As6>,
                    DeserializeAsWrap<T7, As7>,
                    DeserializeAsWrap<T8, As8>>(PhantomData))
    }
}tuple_impl!(9 0 T0 As0 1 T1 As1 2 T2 As2 3 T3 As3 4 T4 As4 5 T5 As5 6 T6 As6 7 T7 As7 8 T8 As8);
728impl<'de, T0, As0, T1, As1, T2, As2, T3, As3, T4, As4, T5, As5, T6, As6, T7,
    As7, T8, As8, T9, As9>
    DeserializeAs<'de, (T0, T1, T2, T3, T4, T5, T6, T7, T8, T9)> for
    (As0, As1, As2, As3, As4, As5, As6, As7, As8, As9) where
    As0: DeserializeAs<'de, T0>, As1: DeserializeAs<'de, T1>,
    As2: DeserializeAs<'de, T2>, As3: DeserializeAs<'de, T3>,
    As4: DeserializeAs<'de, T4>, As5: DeserializeAs<'de, T5>,
    As6: DeserializeAs<'de, T6>, As7: DeserializeAs<'de, T7>,
    As8: DeserializeAs<'de, T8>, As9: DeserializeAs<'de, T9> {
    fn deserialize_as<D>(deserializer: D)
        -> Result<(T0, T1, T2, T3, T4, T5, T6, T7, T8, T9), D::Error> where
        D: Deserializer<'de> {
        struct TupleVisitor<T0, T1, T2, T3, T4, T5, T6, T7, T8,
            T9>(PhantomData<(T0, T1, T2, T3, T4, T5, T6, T7, T8, T9)>);
        impl<'de, T0, As0, T1, As1, T2, As2, T3, As3, T4, As4, T5, As5, T6,
            As6, T7, As7, T8, As8, T9, As9> Visitor<'de> for
            TupleVisitor<DeserializeAsWrap<T0, As0>,
            DeserializeAsWrap<T1, As1>, DeserializeAsWrap<T2, As2>,
            DeserializeAsWrap<T3, As3>, DeserializeAsWrap<T4, As4>,
            DeserializeAsWrap<T5, As5>, DeserializeAsWrap<T6, As6>,
            DeserializeAsWrap<T7, As7>, DeserializeAsWrap<T8, As8>,
            DeserializeAsWrap<T9, As9>> where As0: DeserializeAs<'de, T0>,
            As1: DeserializeAs<'de, T1>, As2: DeserializeAs<'de, T2>,
            As3: DeserializeAs<'de, T3>, As4: DeserializeAs<'de, T4>,
            As5: DeserializeAs<'de, T5>, As6: DeserializeAs<'de, T6>,
            As7: DeserializeAs<'de, T7>, As8: DeserializeAs<'de, T8>,
            As9: DeserializeAs<'de, T9> {
            type Value = (T0, T1, T2, T3, T4, T5, T6, T7, T8, T9);
            fn expecting(&self, formatter: &mut fmt::Formatter<'_>)
                -> fmt::Result {
                formatter.write_str("a tuple of size 10")
            }
            #[allow(non_snake_case)]
            fn visit_seq<A>(self, mut seq: A) -> Result<Self::Value, A::Error>
                where A: SeqAccess<'de> {
                let T0: DeserializeAsWrap<T0, As0> =
                    match seq.next_element()? {
                        Some(value) => value,
                        None => return Err(DeError::invalid_length(0, &self)),
                    };
                let T1: DeserializeAsWrap<T1, As1> =
                    match seq.next_element()? {
                        Some(value) => value,
                        None => return Err(DeError::invalid_length(1, &self)),
                    };
                let T2: DeserializeAsWrap<T2, As2> =
                    match seq.next_element()? {
                        Some(value) => value,
                        None => return Err(DeError::invalid_length(2, &self)),
                    };
                let T3: DeserializeAsWrap<T3, As3> =
                    match seq.next_element()? {
                        Some(value) => value,
                        None => return Err(DeError::invalid_length(3, &self)),
                    };
                let T4: DeserializeAsWrap<T4, As4> =
                    match seq.next_element()? {
                        Some(value) => value,
                        None => return Err(DeError::invalid_length(4, &self)),
                    };
                let T5: DeserializeAsWrap<T5, As5> =
                    match seq.next_element()? {
                        Some(value) => value,
                        None => return Err(DeError::invalid_length(5, &self)),
                    };
                let T6: DeserializeAsWrap<T6, As6> =
                    match seq.next_element()? {
                        Some(value) => value,
                        None => return Err(DeError::invalid_length(6, &self)),
                    };
                let T7: DeserializeAsWrap<T7, As7> =
                    match seq.next_element()? {
                        Some(value) => value,
                        None => return Err(DeError::invalid_length(7, &self)),
                    };
                let T8: DeserializeAsWrap<T8, As8> =
                    match seq.next_element()? {
                        Some(value) => value,
                        None => return Err(DeError::invalid_length(8, &self)),
                    };
                let T9: DeserializeAsWrap<T9, As9> =
                    match seq.next_element()? {
                        Some(value) => value,
                        None => return Err(DeError::invalid_length(9, &self)),
                    };
                Ok((T0.into_inner(), T1.into_inner(), T2.into_inner(),
                        T3.into_inner(), T4.into_inner(), T5.into_inner(),
                        T6.into_inner(), T7.into_inner(), T8.into_inner(),
                        T9.into_inner()))
            }
        }
        deserializer.deserialize_tuple(10,
            TupleVisitor::<DeserializeAsWrap<T0, As0>,
                    DeserializeAsWrap<T1, As1>, DeserializeAsWrap<T2, As2>,
                    DeserializeAsWrap<T3, As3>, DeserializeAsWrap<T4, As4>,
                    DeserializeAsWrap<T5, As5>, DeserializeAsWrap<T6, As6>,
                    DeserializeAsWrap<T7, As7>, DeserializeAsWrap<T8, As8>,
                    DeserializeAsWrap<T9, As9>>(PhantomData))
    }
}tuple_impl!(10 0 T0 As0 1 T1 As1 2 T2 As2 3 T3 As3 4 T4 As4 5 T5 As5 6 T6 As6 7 T7 As7 8 T8 As8 9 T9 As9);
729impl<'de, T0, As0, T1, As1, T2, As2, T3, As3, T4, As4, T5, As5, T6, As6, T7,
    As7, T8, As8, T9, As9, T10, As10>
    DeserializeAs<'de, (T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10)> for
    (As0, As1, As2, As3, As4, As5, As6, As7, As8, As9, As10) where
    As0: DeserializeAs<'de, T0>, As1: DeserializeAs<'de, T1>,
    As2: DeserializeAs<'de, T2>, As3: DeserializeAs<'de, T3>,
    As4: DeserializeAs<'de, T4>, As5: DeserializeAs<'de, T5>,
    As6: DeserializeAs<'de, T6>, As7: DeserializeAs<'de, T7>,
    As8: DeserializeAs<'de, T8>, As9: DeserializeAs<'de, T9>,
    As10: DeserializeAs<'de, T10> {
    fn deserialize_as<D>(deserializer: D)
        -> Result<(T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10), D::Error>
        where D: Deserializer<'de> {
        struct TupleVisitor<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9,
            T10>(PhantomData<(T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10)>);
        impl<'de, T0, As0, T1, As1, T2, As2, T3, As3, T4, As4, T5, As5, T6,
            As6, T7, As7, T8, As8, T9, As9, T10, As10> Visitor<'de> for
            TupleVisitor<DeserializeAsWrap<T0, As0>,
            DeserializeAsWrap<T1, As1>, DeserializeAsWrap<T2, As2>,
            DeserializeAsWrap<T3, As3>, DeserializeAsWrap<T4, As4>,
            DeserializeAsWrap<T5, As5>, DeserializeAsWrap<T6, As6>,
            DeserializeAsWrap<T7, As7>, DeserializeAsWrap<T8, As8>,
            DeserializeAsWrap<T9, As9>, DeserializeAsWrap<T10, As10>> where
            As0: DeserializeAs<'de, T0>, As1: DeserializeAs<'de, T1>,
            As2: DeserializeAs<'de, T2>, As3: DeserializeAs<'de, T3>,
            As4: DeserializeAs<'de, T4>, As5: DeserializeAs<'de, T5>,
            As6: DeserializeAs<'de, T6>, As7: DeserializeAs<'de, T7>,
            As8: DeserializeAs<'de, T8>, As9: DeserializeAs<'de, T9>,
            As10: DeserializeAs<'de, T10> {
            type Value = (T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10);
            fn expecting(&self, formatter: &mut fmt::Formatter<'_>)
                -> fmt::Result {
                formatter.write_str("a tuple of size 11")
            }
            #[allow(non_snake_case)]
            fn visit_seq<A>(self, mut seq: A) -> Result<Self::Value, A::Error>
                where A: SeqAccess<'de> {
                let T0: DeserializeAsWrap<T0, As0> =
                    match seq.next_element()? {
                        Some(value) => value,
                        None => return Err(DeError::invalid_length(0, &self)),
                    };
                let T1: DeserializeAsWrap<T1, As1> =
                    match seq.next_element()? {
                        Some(value) => value,
                        None => return Err(DeError::invalid_length(1, &self)),
                    };
                let T2: DeserializeAsWrap<T2, As2> =
                    match seq.next_element()? {
                        Some(value) => value,
                        None => return Err(DeError::invalid_length(2, &self)),
                    };
                let T3: DeserializeAsWrap<T3, As3> =
                    match seq.next_element()? {
                        Some(value) => value,
                        None => return Err(DeError::invalid_length(3, &self)),
                    };
                let T4: DeserializeAsWrap<T4, As4> =
                    match seq.next_element()? {
                        Some(value) => value,
                        None => return Err(DeError::invalid_length(4, &self)),
                    };
                let T5: DeserializeAsWrap<T5, As5> =
                    match seq.next_element()? {
                        Some(value) => value,
                        None => return Err(DeError::invalid_length(5, &self)),
                    };
                let T6: DeserializeAsWrap<T6, As6> =
                    match seq.next_element()? {
                        Some(value) => value,
                        None => return Err(DeError::invalid_length(6, &self)),
                    };
                let T7: DeserializeAsWrap<T7, As7> =
                    match seq.next_element()? {
                        Some(value) => value,
                        None => return Err(DeError::invalid_length(7, &self)),
                    };
                let T8: DeserializeAsWrap<T8, As8> =
                    match seq.next_element()? {
                        Some(value) => value,
                        None => return Err(DeError::invalid_length(8, &self)),
                    };
                let T9: DeserializeAsWrap<T9, As9> =
                    match seq.next_element()? {
                        Some(value) => value,
                        None => return Err(DeError::invalid_length(9, &self)),
                    };
                let T10: DeserializeAsWrap<T10, As10> =
                    match seq.next_element()? {
                        Some(value) => value,
                        None => return Err(DeError::invalid_length(10, &self)),
                    };
                Ok((T0.into_inner(), T1.into_inner(), T2.into_inner(),
                        T3.into_inner(), T4.into_inner(), T5.into_inner(),
                        T6.into_inner(), T7.into_inner(), T8.into_inner(),
                        T9.into_inner(), T10.into_inner()))
            }
        }
        deserializer.deserialize_tuple(11,
            TupleVisitor::<DeserializeAsWrap<T0, As0>,
                    DeserializeAsWrap<T1, As1>, DeserializeAsWrap<T2, As2>,
                    DeserializeAsWrap<T3, As3>, DeserializeAsWrap<T4, As4>,
                    DeserializeAsWrap<T5, As5>, DeserializeAsWrap<T6, As6>,
                    DeserializeAsWrap<T7, As7>, DeserializeAsWrap<T8, As8>,
                    DeserializeAsWrap<T9, As9>,
                    DeserializeAsWrap<T10, As10>>(PhantomData))
    }
}tuple_impl!(11 0 T0 As0 1 T1 As1 2 T2 As2 3 T3 As3 4 T4 As4 5 T5 As5 6 T6 As6 7 T7 As7 8 T8 As8 9 T9 As9 10 T10 As10);
730impl<'de, T0, As0, T1, As1, T2, As2, T3, As3, T4, As4, T5, As5, T6, As6, T7,
    As7, T8, As8, T9, As9, T10, As10, T11, As11>
    DeserializeAs<'de, (T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11)> for
    (As0, As1, As2, As3, As4, As5, As6, As7, As8, As9, As10, As11) where
    As0: DeserializeAs<'de, T0>, As1: DeserializeAs<'de, T1>,
    As2: DeserializeAs<'de, T2>, As3: DeserializeAs<'de, T3>,
    As4: DeserializeAs<'de, T4>, As5: DeserializeAs<'de, T5>,
    As6: DeserializeAs<'de, T6>, As7: DeserializeAs<'de, T7>,
    As8: DeserializeAs<'de, T8>, As9: DeserializeAs<'de, T9>,
    As10: DeserializeAs<'de, T10>, As11: DeserializeAs<'de, T11> {
    fn deserialize_as<D>(deserializer: D)
        ->
            Result<(T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11),
            D::Error> where D: Deserializer<'de> {
        struct TupleVisitor<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10,
            T11>(PhantomData<(T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10,
            T11)>);
        impl<'de, T0, As0, T1, As1, T2, As2, T3, As3, T4, As4, T5, As5, T6,
            As6, T7, As7, T8, As8, T9, As9, T10, As10, T11, As11> Visitor<'de>
            for
            TupleVisitor<DeserializeAsWrap<T0, As0>,
            DeserializeAsWrap<T1, As1>, DeserializeAsWrap<T2, As2>,
            DeserializeAsWrap<T3, As3>, DeserializeAsWrap<T4, As4>,
            DeserializeAsWrap<T5, As5>, DeserializeAsWrap<T6, As6>,
            DeserializeAsWrap<T7, As7>, DeserializeAsWrap<T8, As8>,
            DeserializeAsWrap<T9, As9>, DeserializeAsWrap<T10, As10>,
            DeserializeAsWrap<T11, As11>> where As0: DeserializeAs<'de, T0>,
            As1: DeserializeAs<'de, T1>, As2: DeserializeAs<'de, T2>,
            As3: DeserializeAs<'de, T3>, As4: DeserializeAs<'de, T4>,
            As5: DeserializeAs<'de, T5>, As6: DeserializeAs<'de, T6>,
            As7: DeserializeAs<'de, T7>, As8: DeserializeAs<'de, T8>,
            As9: DeserializeAs<'de, T9>, As10: DeserializeAs<'de, T10>,
            As11: DeserializeAs<'de, T11> {
            type Value = (T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11);
            fn expecting(&self, formatter: &mut fmt::Formatter<'_>)
                -> fmt::Result {
                formatter.write_str("a tuple of size 12")
            }
            #[allow(non_snake_case)]
            fn visit_seq<A>(self, mut seq: A) -> Result<Self::Value, A::Error>
                where A: SeqAccess<'de> {
                let T0: DeserializeAsWrap<T0, As0> =
                    match seq.next_element()? {
                        Some(value) => value,
                        None => return Err(DeError::invalid_length(0, &self)),
                    };
                let T1: DeserializeAsWrap<T1, As1> =
                    match seq.next_element()? {
                        Some(value) => value,
                        None => return Err(DeError::invalid_length(1, &self)),
                    };
                let T2: DeserializeAsWrap<T2, As2> =
                    match seq.next_element()? {
                        Some(value) => value,
                        None => return Err(DeError::invalid_length(2, &self)),
                    };
                let T3: DeserializeAsWrap<T3, As3> =
                    match seq.next_element()? {
                        Some(value) => value,
                        None => return Err(DeError::invalid_length(3, &self)),
                    };
                let T4: DeserializeAsWrap<T4, As4> =
                    match seq.next_element()? {
                        Some(value) => value,
                        None => return Err(DeError::invalid_length(4, &self)),
                    };
                let T5: DeserializeAsWrap<T5, As5> =
                    match seq.next_element()? {
                        Some(value) => value,
                        None => return Err(DeError::invalid_length(5, &self)),
                    };
                let T6: DeserializeAsWrap<T6, As6> =
                    match seq.next_element()? {
                        Some(value) => value,
                        None => return Err(DeError::invalid_length(6, &self)),
                    };
                let T7: DeserializeAsWrap<T7, As7> =
                    match seq.next_element()? {
                        Some(value) => value,
                        None => return Err(DeError::invalid_length(7, &self)),
                    };
                let T8: DeserializeAsWrap<T8, As8> =
                    match seq.next_element()? {
                        Some(value) => value,
                        None => return Err(DeError::invalid_length(8, &self)),
                    };
                let T9: DeserializeAsWrap<T9, As9> =
                    match seq.next_element()? {
                        Some(value) => value,
                        None => return Err(DeError::invalid_length(9, &self)),
                    };
                let T10: DeserializeAsWrap<T10, As10> =
                    match seq.next_element()? {
                        Some(value) => value,
                        None => return Err(DeError::invalid_length(10, &self)),
                    };
                let T11: DeserializeAsWrap<T11, As11> =
                    match seq.next_element()? {
                        Some(value) => value,
                        None => return Err(DeError::invalid_length(11, &self)),
                    };
                Ok((T0.into_inner(), T1.into_inner(), T2.into_inner(),
                        T3.into_inner(), T4.into_inner(), T5.into_inner(),
                        T6.into_inner(), T7.into_inner(), T8.into_inner(),
                        T9.into_inner(), T10.into_inner(), T11.into_inner()))
            }
        }
        deserializer.deserialize_tuple(12,
            TupleVisitor::<DeserializeAsWrap<T0, As0>,
                    DeserializeAsWrap<T1, As1>, DeserializeAsWrap<T2, As2>,
                    DeserializeAsWrap<T3, As3>, DeserializeAsWrap<T4, As4>,
                    DeserializeAsWrap<T5, As5>, DeserializeAsWrap<T6, As6>,
                    DeserializeAsWrap<T7, As7>, DeserializeAsWrap<T8, As8>,
                    DeserializeAsWrap<T9, As9>, DeserializeAsWrap<T10, As10>,
                    DeserializeAsWrap<T11, As11>>(PhantomData))
    }
}tuple_impl!(12 0 T0 As0 1 T1 As1 2 T2 As2 3 T3 As3 4 T4 As4 5 T5 As5 6 T6 As6 7 T7 As7 8 T8 As8 9 T9 As9 10 T10 As10 11 T11 As11);
731impl<'de, T0, As0, T1, As1, T2, As2, T3, As3, T4, As4, T5, As5, T6, As6, T7,
    As7, T8, As8, T9, As9, T10, As10, T11, As11, T12, As12>
    DeserializeAs<'de,
    (T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12)> for
    (As0, As1, As2, As3, As4, As5, As6, As7, As8, As9, As10, As11, As12) where
    As0: DeserializeAs<'de, T0>, As1: DeserializeAs<'de, T1>,
    As2: DeserializeAs<'de, T2>, As3: DeserializeAs<'de, T3>,
    As4: DeserializeAs<'de, T4>, As5: DeserializeAs<'de, T5>,
    As6: DeserializeAs<'de, T6>, As7: DeserializeAs<'de, T7>,
    As8: DeserializeAs<'de, T8>, As9: DeserializeAs<'de, T9>,
    As10: DeserializeAs<'de, T10>, As11: DeserializeAs<'de, T11>,
    As12: DeserializeAs<'de, T12> {
    fn deserialize_as<D>(deserializer: D)
        ->
            Result<(T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12),
            D::Error> where D: Deserializer<'de> {
        struct TupleVisitor<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
            T12>(PhantomData<(T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10,
            T11, T12)>);
        impl<'de, T0, As0, T1, As1, T2, As2, T3, As3, T4, As4, T5, As5, T6,
            As6, T7, As7, T8, As8, T9, As9, T10, As10, T11, As11, T12, As12>
            Visitor<'de> for
            TupleVisitor<DeserializeAsWrap<T0, As0>,
            DeserializeAsWrap<T1, As1>, DeserializeAsWrap<T2, As2>,
            DeserializeAsWrap<T3, As3>, DeserializeAsWrap<T4, As4>,
            DeserializeAsWrap<T5, As5>, DeserializeAsWrap<T6, As6>,
            DeserializeAsWrap<T7, As7>, DeserializeAsWrap<T8, As8>,
            DeserializeAsWrap<T9, As9>, DeserializeAsWrap<T10, As10>,
            DeserializeAsWrap<T11, As11>, DeserializeAsWrap<T12, As12>> where
            As0: DeserializeAs<'de, T0>, As1: DeserializeAs<'de, T1>,
            As2: DeserializeAs<'de, T2>, As3: DeserializeAs<'de, T3>,
            As4: DeserializeAs<'de, T4>, As5: DeserializeAs<'de, T5>,
            As6: DeserializeAs<'de, T6>, As7: DeserializeAs<'de, T7>,
            As8: DeserializeAs<'de, T8>, As9: DeserializeAs<'de, T9>,
            As10: DeserializeAs<'de, T10>, As11: DeserializeAs<'de, T11>,
            As12: DeserializeAs<'de, T12> {
            type Value =
                (T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12);
            fn expecting(&self, formatter: &mut fmt::Formatter<'_>)
                -> fmt::Result {
                formatter.write_str("a tuple of size 13")
            }
            #[allow(non_snake_case)]
            fn visit_seq<A>(self, mut seq: A) -> Result<Self::Value, A::Error>
                where A: SeqAccess<'de> {
                let T0: DeserializeAsWrap<T0, As0> =
                    match seq.next_element()? {
                        Some(value) => value,
                        None => return Err(DeError::invalid_length(0, &self)),
                    };
                let T1: DeserializeAsWrap<T1, As1> =
                    match seq.next_element()? {
                        Some(value) => value,
                        None => return Err(DeError::invalid_length(1, &self)),
                    };
                let T2: DeserializeAsWrap<T2, As2> =
                    match seq.next_element()? {
                        Some(value) => value,
                        None => return Err(DeError::invalid_length(2, &self)),
                    };
                let T3: DeserializeAsWrap<T3, As3> =
                    match seq.next_element()? {
                        Some(value) => value,
                        None => return Err(DeError::invalid_length(3, &self)),
                    };
                let T4: DeserializeAsWrap<T4, As4> =
                    match seq.next_element()? {
                        Some(value) => value,
                        None => return Err(DeError::invalid_length(4, &self)),
                    };
                let T5: DeserializeAsWrap<T5, As5> =
                    match seq.next_element()? {
                        Some(value) => value,
                        None => return Err(DeError::invalid_length(5, &self)),
                    };
                let T6: DeserializeAsWrap<T6, As6> =
                    match seq.next_element()? {
                        Some(value) => value,
                        None => return Err(DeError::invalid_length(6, &self)),
                    };
                let T7: DeserializeAsWrap<T7, As7> =
                    match seq.next_element()? {
                        Some(value) => value,
                        None => return Err(DeError::invalid_length(7, &self)),
                    };
                let T8: DeserializeAsWrap<T8, As8> =
                    match seq.next_element()? {
                        Some(value) => value,
                        None => return Err(DeError::invalid_length(8, &self)),
                    };
                let T9: DeserializeAsWrap<T9, As9> =
                    match seq.next_element()? {
                        Some(value) => value,
                        None => return Err(DeError::invalid_length(9, &self)),
                    };
                let T10: DeserializeAsWrap<T10, As10> =
                    match seq.next_element()? {
                        Some(value) => value,
                        None => return Err(DeError::invalid_length(10, &self)),
                    };
                let T11: DeserializeAsWrap<T11, As11> =
                    match seq.next_element()? {
                        Some(value) => value,
                        None => return Err(DeError::invalid_length(11, &self)),
                    };
                let T12: DeserializeAsWrap<T12, As12> =
                    match seq.next_element()? {
                        Some(value) => value,
                        None => return Err(DeError::invalid_length(12, &self)),
                    };
                Ok((T0.into_inner(), T1.into_inner(), T2.into_inner(),
                        T3.into_inner(), T4.into_inner(), T5.into_inner(),
                        T6.into_inner(), T7.into_inner(), T8.into_inner(),
                        T9.into_inner(), T10.into_inner(), T11.into_inner(),
                        T12.into_inner()))
            }
        }
        deserializer.deserialize_tuple(13,
            TupleVisitor::<DeserializeAsWrap<T0, As0>,
                    DeserializeAsWrap<T1, As1>, DeserializeAsWrap<T2, As2>,
                    DeserializeAsWrap<T3, As3>, DeserializeAsWrap<T4, As4>,
                    DeserializeAsWrap<T5, As5>, DeserializeAsWrap<T6, As6>,
                    DeserializeAsWrap<T7, As7>, DeserializeAsWrap<T8, As8>,
                    DeserializeAsWrap<T9, As9>, DeserializeAsWrap<T10, As10>,
                    DeserializeAsWrap<T11, As11>,
                    DeserializeAsWrap<T12, As12>>(PhantomData))
    }
}tuple_impl!(13 0 T0 As0 1 T1 As1 2 T2 As2 3 T3 As3 4 T4 As4 5 T5 As5 6 T6 As6 7 T7 As7 8 T8 As8 9 T9 As9 10 T10 As10 11 T11 As11 12 T12 As12);
732impl<'de, T0, As0, T1, As1, T2, As2, T3, As3, T4, As4, T5, As5, T6, As6, T7,
    As7, T8, As8, T9, As9, T10, As10, T11, As11, T12, As12, T13, As13>
    DeserializeAs<'de,
    (T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13)> for
    (As0, As1, As2, As3, As4, As5, As6, As7, As8, As9, As10, As11, As12, As13)
    where As0: DeserializeAs<'de, T0>, As1: DeserializeAs<'de, T1>,
    As2: DeserializeAs<'de, T2>, As3: DeserializeAs<'de, T3>,
    As4: DeserializeAs<'de, T4>, As5: DeserializeAs<'de, T5>,
    As6: DeserializeAs<'de, T6>, As7: DeserializeAs<'de, T7>,
    As8: DeserializeAs<'de, T8>, As9: DeserializeAs<'de, T9>,
    As10: DeserializeAs<'de, T10>, As11: DeserializeAs<'de, T11>,
    As12: DeserializeAs<'de, T12>, As13: DeserializeAs<'de, T13> {
    fn deserialize_as<D>(deserializer: D)
        ->
            Result<(T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
            T13), D::Error> where D: Deserializer<'de> {
        struct TupleVisitor<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
            T12,
            T13>(PhantomData<(T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10,
            T11, T12, T13)>);
        impl<'de, T0, As0, T1, As1, T2, As2, T3, As3, T4, As4, T5, As5, T6,
            As6, T7, As7, T8, As8, T9, As9, T10, As10, T11, As11, T12, As12,
            T13, As13> Visitor<'de> for
            TupleVisitor<DeserializeAsWrap<T0, As0>,
            DeserializeAsWrap<T1, As1>, DeserializeAsWrap<T2, As2>,
            DeserializeAsWrap<T3, As3>, DeserializeAsWrap<T4, As4>,
            DeserializeAsWrap<T5, As5>, DeserializeAsWrap<T6, As6>,
            DeserializeAsWrap<T7, As7>, DeserializeAsWrap<T8, As8>,
            DeserializeAsWrap<T9, As9>, DeserializeAsWrap<T10, As10>,
            DeserializeAsWrap<T11, As11>, DeserializeAsWrap<T12, As12>,
            DeserializeAsWrap<T13, As13>> where As0: DeserializeAs<'de, T0>,
            As1: DeserializeAs<'de, T1>, As2: DeserializeAs<'de, T2>,
            As3: DeserializeAs<'de, T3>, As4: DeserializeAs<'de, T4>,
            As5: DeserializeAs<'de, T5>, As6: DeserializeAs<'de, T6>,
            As7: DeserializeAs<'de, T7>, As8: DeserializeAs<'de, T8>,
            As9: DeserializeAs<'de, T9>, As10: DeserializeAs<'de, T10>,
            As11: DeserializeAs<'de, T11>, As12: DeserializeAs<'de, T12>,
            As13: DeserializeAs<'de, T13> {
            type Value =
                (T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13);
            fn expecting(&self, formatter: &mut fmt::Formatter<'_>)
                -> fmt::Result {
                formatter.write_str("a tuple of size 14")
            }
            #[allow(non_snake_case)]
            fn visit_seq<A>(self, mut seq: A) -> Result<Self::Value, A::Error>
                where A: SeqAccess<'de> {
                let T0: DeserializeAsWrap<T0, As0> =
                    match seq.next_element()? {
                        Some(value) => value,
                        None => return Err(DeError::invalid_length(0, &self)),
                    };
                let T1: DeserializeAsWrap<T1, As1> =
                    match seq.next_element()? {
                        Some(value) => value,
                        None => return Err(DeError::invalid_length(1, &self)),
                    };
                let T2: DeserializeAsWrap<T2, As2> =
                    match seq.next_element()? {
                        Some(value) => value,
                        None => return Err(DeError::invalid_length(2, &self)),
                    };
                let T3: DeserializeAsWrap<T3, As3> =
                    match seq.next_element()? {
                        Some(value) => value,
                        None => return Err(DeError::invalid_length(3, &self)),
                    };
                let T4: DeserializeAsWrap<T4, As4> =
                    match seq.next_element()? {
                        Some(value) => value,
                        None => return Err(DeError::invalid_length(4, &self)),
                    };
                let T5: DeserializeAsWrap<T5, As5> =
                    match seq.next_element()? {
                        Some(value) => value,
                        None => return Err(DeError::invalid_length(5, &self)),
                    };
                let T6: DeserializeAsWrap<T6, As6> =
                    match seq.next_element()? {
                        Some(value) => value,
                        None => return Err(DeError::invalid_length(6, &self)),
                    };
                let T7: DeserializeAsWrap<T7, As7> =
                    match seq.next_element()? {
                        Some(value) => value,
                        None => return Err(DeError::invalid_length(7, &self)),
                    };
                let T8: DeserializeAsWrap<T8, As8> =
                    match seq.next_element()? {
                        Some(value) => value,
                        None => return Err(DeError::invalid_length(8, &self)),
                    };
                let T9: DeserializeAsWrap<T9, As9> =
                    match seq.next_element()? {
                        Some(value) => value,
                        None => return Err(DeError::invalid_length(9, &self)),
                    };
                let T10: DeserializeAsWrap<T10, As10> =
                    match seq.next_element()? {
                        Some(value) => value,
                        None => return Err(DeError::invalid_length(10, &self)),
                    };
                let T11: DeserializeAsWrap<T11, As11> =
                    match seq.next_element()? {
                        Some(value) => value,
                        None => return Err(DeError::invalid_length(11, &self)),
                    };
                let T12: DeserializeAsWrap<T12, As12> =
                    match seq.next_element()? {
                        Some(value) => value,
                        None => return Err(DeError::invalid_length(12, &self)),
                    };
                let T13: DeserializeAsWrap<T13, As13> =
                    match seq.next_element()? {
                        Some(value) => value,
                        None => return Err(DeError::invalid_length(13, &self)),
                    };
                Ok((T0.into_inner(), T1.into_inner(), T2.into_inner(),
                        T3.into_inner(), T4.into_inner(), T5.into_inner(),
                        T6.into_inner(), T7.into_inner(), T8.into_inner(),
                        T9.into_inner(), T10.into_inner(), T11.into_inner(),
                        T12.into_inner(), T13.into_inner()))
            }
        }
        deserializer.deserialize_tuple(14,
            TupleVisitor::<DeserializeAsWrap<T0, As0>,
                    DeserializeAsWrap<T1, As1>, DeserializeAsWrap<T2, As2>,
                    DeserializeAsWrap<T3, As3>, DeserializeAsWrap<T4, As4>,
                    DeserializeAsWrap<T5, As5>, DeserializeAsWrap<T6, As6>,
                    DeserializeAsWrap<T7, As7>, DeserializeAsWrap<T8, As8>,
                    DeserializeAsWrap<T9, As9>, DeserializeAsWrap<T10, As10>,
                    DeserializeAsWrap<T11, As11>, DeserializeAsWrap<T12, As12>,
                    DeserializeAsWrap<T13, As13>>(PhantomData))
    }
}tuple_impl!(14 0 T0 As0 1 T1 As1 2 T2 As2 3 T3 As3 4 T4 As4 5 T5 As5 6 T6 As6 7 T7 As7 8 T8 As8 9 T9 As9 10 T10 As10 11 T11 As11 12 T12 As12 13 T13 As13);
733impl<'de, T0, As0, T1, As1, T2, As2, T3, As3, T4, As4, T5, As5, T6, As6, T7,
    As7, T8, As8, T9, As9, T10, As10, T11, As11, T12, As12, T13, As13, T14,
    As14>
    DeserializeAs<'de,
    (T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14)> for
    (As0, As1, As2, As3, As4, As5, As6, As7, As8, As9, As10, As11, As12, As13,
    As14) where As0: DeserializeAs<'de, T0>, As1: DeserializeAs<'de, T1>,
    As2: DeserializeAs<'de, T2>, As3: DeserializeAs<'de, T3>,
    As4: DeserializeAs<'de, T4>, As5: DeserializeAs<'de, T5>,
    As6: DeserializeAs<'de, T6>, As7: DeserializeAs<'de, T7>,
    As8: DeserializeAs<'de, T8>, As9: DeserializeAs<'de, T9>,
    As10: DeserializeAs<'de, T10>, As11: DeserializeAs<'de, T11>,
    As12: DeserializeAs<'de, T12>, As13: DeserializeAs<'de, T13>,
    As14: DeserializeAs<'de, T14> {
    fn deserialize_as<D>(deserializer: D)
        ->
            Result<(T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
            T13, T14), D::Error> where D: Deserializer<'de> {
        struct TupleVisitor<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
            T12, T13,
            T14>(PhantomData<(T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10,
            T11, T12, T13, T14)>);
        impl<'de, T0, As0, T1, As1, T2, As2, T3, As3, T4, As4, T5, As5, T6,
            As6, T7, As7, T8, As8, T9, As9, T10, As10, T11, As11, T12, As12,
            T13, As13, T14, As14> Visitor<'de> for
            TupleVisitor<DeserializeAsWrap<T0, As0>,
            DeserializeAsWrap<T1, As1>, DeserializeAsWrap<T2, As2>,
            DeserializeAsWrap<T3, As3>, DeserializeAsWrap<T4, As4>,
            DeserializeAsWrap<T5, As5>, DeserializeAsWrap<T6, As6>,
            DeserializeAsWrap<T7, As7>, DeserializeAsWrap<T8, As8>,
            DeserializeAsWrap<T9, As9>, DeserializeAsWrap<T10, As10>,
            DeserializeAsWrap<T11, As11>, DeserializeAsWrap<T12, As12>,
            DeserializeAsWrap<T13, As13>, DeserializeAsWrap<T14, As14>> where
            As0: DeserializeAs<'de, T0>, As1: DeserializeAs<'de, T1>,
            As2: DeserializeAs<'de, T2>, As3: DeserializeAs<'de, T3>,
            As4: DeserializeAs<'de, T4>, As5: DeserializeAs<'de, T5>,
            As6: DeserializeAs<'de, T6>, As7: DeserializeAs<'de, T7>,
            As8: DeserializeAs<'de, T8>, As9: DeserializeAs<'de, T9>,
            As10: DeserializeAs<'de, T10>, As11: DeserializeAs<'de, T11>,
            As12: DeserializeAs<'de, T12>, As13: DeserializeAs<'de, T13>,
            As14: DeserializeAs<'de, T14> {
            type Value =
                (T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
                T14);
            fn expecting(&self, formatter: &mut fmt::Formatter<'_>)
                -> fmt::Result {
                formatter.write_str("a tuple of size 15")
            }
            #[allow(non_snake_case)]
            fn visit_seq<A>(self, mut seq: A) -> Result<Self::Value, A::Error>
                where A: SeqAccess<'de> {
                let T0: DeserializeAsWrap<T0, As0> =
                    match seq.next_element()? {
                        Some(value) => value,
                        None => return Err(DeError::invalid_length(0, &self)),
                    };
                let T1: DeserializeAsWrap<T1, As1> =
                    match seq.next_element()? {
                        Some(value) => value,
                        None => return Err(DeError::invalid_length(1, &self)),
                    };
                let T2: DeserializeAsWrap<T2, As2> =
                    match seq.next_element()? {
                        Some(value) => value,
                        None => return Err(DeError::invalid_length(2, &self)),
                    };
                let T3: DeserializeAsWrap<T3, As3> =
                    match seq.next_element()? {
                        Some(value) => value,
                        None => return Err(DeError::invalid_length(3, &self)),
                    };
                let T4: DeserializeAsWrap<T4, As4> =
                    match seq.next_element()? {
                        Some(value) => value,
                        None => return Err(DeError::invalid_length(4, &self)),
                    };
                let T5: DeserializeAsWrap<T5, As5> =
                    match seq.next_element()? {
                        Some(value) => value,
                        None => return Err(DeError::invalid_length(5, &self)),
                    };
                let T6: DeserializeAsWrap<T6, As6> =
                    match seq.next_element()? {
                        Some(value) => value,
                        None => return Err(DeError::invalid_length(6, &self)),
                    };
                let T7: DeserializeAsWrap<T7, As7> =
                    match seq.next_element()? {
                        Some(value) => value,
                        None => return Err(DeError::invalid_length(7, &self)),
                    };
                let T8: DeserializeAsWrap<T8, As8> =
                    match seq.next_element()? {
                        Some(value) => value,
                        None => return Err(DeError::invalid_length(8, &self)),
                    };
                let T9: DeserializeAsWrap<T9, As9> =
                    match seq.next_element()? {
                        Some(value) => value,
                        None => return Err(DeError::invalid_length(9, &self)),
                    };
                let T10: DeserializeAsWrap<T10, As10> =
                    match seq.next_element()? {
                        Some(value) => value,
                        None => return Err(DeError::invalid_length(10, &self)),
                    };
                let T11: DeserializeAsWrap<T11, As11> =
                    match seq.next_element()? {
                        Some(value) => value,
                        None => return Err(DeError::invalid_length(11, &self)),
                    };
                let T12: DeserializeAsWrap<T12, As12> =
                    match seq.next_element()? {
                        Some(value) => value,
                        None => return Err(DeError::invalid_length(12, &self)),
                    };
                let T13: DeserializeAsWrap<T13, As13> =
                    match seq.next_element()? {
                        Some(value) => value,
                        None => return Err(DeError::invalid_length(13, &self)),
                    };
                let T14: DeserializeAsWrap<T14, As14> =
                    match seq.next_element()? {
                        Some(value) => value,
                        None => return Err(DeError::invalid_length(14, &self)),
                    };
                Ok((T0.into_inner(), T1.into_inner(), T2.into_inner(),
                        T3.into_inner(), T4.into_inner(), T5.into_inner(),
                        T6.into_inner(), T7.into_inner(), T8.into_inner(),
                        T9.into_inner(), T10.into_inner(), T11.into_inner(),
                        T12.into_inner(), T13.into_inner(), T14.into_inner()))
            }
        }
        deserializer.deserialize_tuple(15,
            TupleVisitor::<DeserializeAsWrap<T0, As0>,
                    DeserializeAsWrap<T1, As1>, DeserializeAsWrap<T2, As2>,
                    DeserializeAsWrap<T3, As3>, DeserializeAsWrap<T4, As4>,
                    DeserializeAsWrap<T5, As5>, DeserializeAsWrap<T6, As6>,
                    DeserializeAsWrap<T7, As7>, DeserializeAsWrap<T8, As8>,
                    DeserializeAsWrap<T9, As9>, DeserializeAsWrap<T10, As10>,
                    DeserializeAsWrap<T11, As11>, DeserializeAsWrap<T12, As12>,
                    DeserializeAsWrap<T13, As13>,
                    DeserializeAsWrap<T14, As14>>(PhantomData))
    }
}tuple_impl!(15 0 T0 As0 1 T1 As1 2 T2 As2 3 T3 As3 4 T4 As4 5 T5 As5 6 T6 As6 7 T7 As7 8 T8 As8 9 T9 As9 10 T10 As10 11 T11 As11 12 T12 As12 13 T13 As13 14 T14 As14);
734impl<'de, T0, As0, T1, As1, T2, As2, T3, As3, T4, As4, T5, As5, T6, As6, T7,
    As7, T8, As8, T9, As9, T10, As10, T11, As11, T12, As12, T13, As13, T14,
    As14, T15, As15>
    DeserializeAs<'de,
    (T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15)>
    for
    (As0, As1, As2, As3, As4, As5, As6, As7, As8, As9, As10, As11, As12, As13,
    As14, As15) where As0: DeserializeAs<'de, T0>,
    As1: DeserializeAs<'de, T1>, As2: DeserializeAs<'de, T2>,
    As3: DeserializeAs<'de, T3>, As4: DeserializeAs<'de, T4>,
    As5: DeserializeAs<'de, T5>, As6: DeserializeAs<'de, T6>,
    As7: DeserializeAs<'de, T7>, As8: DeserializeAs<'de, T8>,
    As9: DeserializeAs<'de, T9>, As10: DeserializeAs<'de, T10>,
    As11: DeserializeAs<'de, T11>, As12: DeserializeAs<'de, T12>,
    As13: DeserializeAs<'de, T13>, As14: DeserializeAs<'de, T14>,
    As15: DeserializeAs<'de, T15> {
    fn deserialize_as<D>(deserializer: D)
        ->
            Result<(T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
            T13, T14, T15), D::Error> where D: Deserializer<'de> {
        struct TupleVisitor<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
            T12, T13, T14,
            T15>(PhantomData<(T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10,
            T11, T12, T13, T14, T15)>);
        impl<'de, T0, As0, T1, As1, T2, As2, T3, As3, T4, As4, T5, As5, T6,
            As6, T7, As7, T8, As8, T9, As9, T10, As10, T11, As11, T12, As12,
            T13, As13, T14, As14, T15, As15> Visitor<'de> for
            TupleVisitor<DeserializeAsWrap<T0, As0>,
            DeserializeAsWrap<T1, As1>, DeserializeAsWrap<T2, As2>,
            DeserializeAsWrap<T3, As3>, DeserializeAsWrap<T4, As4>,
            DeserializeAsWrap<T5, As5>, DeserializeAsWrap<T6, As6>,
            DeserializeAsWrap<T7, As7>, DeserializeAsWrap<T8, As8>,
            DeserializeAsWrap<T9, As9>, DeserializeAsWrap<T10, As10>,
            DeserializeAsWrap<T11, As11>, DeserializeAsWrap<T12, As12>,
            DeserializeAsWrap<T13, As13>, DeserializeAsWrap<T14, As14>,
            DeserializeAsWrap<T15, As15>> where As0: DeserializeAs<'de, T0>,
            As1: DeserializeAs<'de, T1>, As2: DeserializeAs<'de, T2>,
            As3: DeserializeAs<'de, T3>, As4: DeserializeAs<'de, T4>,
            As5: DeserializeAs<'de, T5>, As6: DeserializeAs<'de, T6>,
            As7: DeserializeAs<'de, T7>, As8: DeserializeAs<'de, T8>,
            As9: DeserializeAs<'de, T9>, As10: DeserializeAs<'de, T10>,
            As11: DeserializeAs<'de, T11>, As12: DeserializeAs<'de, T12>,
            As13: DeserializeAs<'de, T13>, As14: DeserializeAs<'de, T14>,
            As15: DeserializeAs<'de, T15> {
            type Value =
                (T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
                T14, T15);
            fn expecting(&self, formatter: &mut fmt::Formatter<'_>)
                -> fmt::Result {
                formatter.write_str("a tuple of size 16")
            }
            #[allow(non_snake_case)]
            fn visit_seq<A>(self, mut seq: A) -> Result<Self::Value, A::Error>
                where A: SeqAccess<'de> {
                let T0: DeserializeAsWrap<T0, As0> =
                    match seq.next_element()? {
                        Some(value) => value,
                        None => return Err(DeError::invalid_length(0, &self)),
                    };
                let T1: DeserializeAsWrap<T1, As1> =
                    match seq.next_element()? {
                        Some(value) => value,
                        None => return Err(DeError::invalid_length(1, &self)),
                    };
                let T2: DeserializeAsWrap<T2, As2> =
                    match seq.next_element()? {
                        Some(value) => value,
                        None => return Err(DeError::invalid_length(2, &self)),
                    };
                let T3: DeserializeAsWrap<T3, As3> =
                    match seq.next_element()? {
                        Some(value) => value,
                        None => return Err(DeError::invalid_length(3, &self)),
                    };
                let T4: DeserializeAsWrap<T4, As4> =
                    match seq.next_element()? {
                        Some(value) => value,
                        None => return Err(DeError::invalid_length(4, &self)),
                    };
                let T5: DeserializeAsWrap<T5, As5> =
                    match seq.next_element()? {
                        Some(value) => value,
                        None => return Err(DeError::invalid_length(5, &self)),
                    };
                let T6: DeserializeAsWrap<T6, As6> =
                    match seq.next_element()? {
                        Some(value) => value,
                        None => return Err(DeError::invalid_length(6, &self)),
                    };
                let T7: DeserializeAsWrap<T7, As7> =
                    match seq.next_element()? {
                        Some(value) => value,
                        None => return Err(DeError::invalid_length(7, &self)),
                    };
                let T8: DeserializeAsWrap<T8, As8> =
                    match seq.next_element()? {
                        Some(value) => value,
                        None => return Err(DeError::invalid_length(8, &self)),
                    };
                let T9: DeserializeAsWrap<T9, As9> =
                    match seq.next_element()? {
                        Some(value) => value,
                        None => return Err(DeError::invalid_length(9, &self)),
                    };
                let T10: DeserializeAsWrap<T10, As10> =
                    match seq.next_element()? {
                        Some(value) => value,
                        None => return Err(DeError::invalid_length(10, &self)),
                    };
                let T11: DeserializeAsWrap<T11, As11> =
                    match seq.next_element()? {
                        Some(value) => value,
                        None => return Err(DeError::invalid_length(11, &self)),
                    };
                let T12: DeserializeAsWrap<T12, As12> =
                    match seq.next_element()? {
                        Some(value) => value,
                        None => return Err(DeError::invalid_length(12, &self)),
                    };
                let T13: DeserializeAsWrap<T13, As13> =
                    match seq.next_element()? {
                        Some(value) => value,
                        None => return Err(DeError::invalid_length(13, &self)),
                    };
                let T14: DeserializeAsWrap<T14, As14> =
                    match seq.next_element()? {
                        Some(value) => value,
                        None => return Err(DeError::invalid_length(14, &self)),
                    };
                let T15: DeserializeAsWrap<T15, As15> =
                    match seq.next_element()? {
                        Some(value) => value,
                        None => return Err(DeError::invalid_length(15, &self)),
                    };
                Ok((T0.into_inner(), T1.into_inner(), T2.into_inner(),
                        T3.into_inner(), T4.into_inner(), T5.into_inner(),
                        T6.into_inner(), T7.into_inner(), T8.into_inner(),
                        T9.into_inner(), T10.into_inner(), T11.into_inner(),
                        T12.into_inner(), T13.into_inner(), T14.into_inner(),
                        T15.into_inner()))
            }
        }
        deserializer.deserialize_tuple(16,
            TupleVisitor::<DeserializeAsWrap<T0, As0>,
                    DeserializeAsWrap<T1, As1>, DeserializeAsWrap<T2, As2>,
                    DeserializeAsWrap<T3, As3>, DeserializeAsWrap<T4, As4>,
                    DeserializeAsWrap<T5, As5>, DeserializeAsWrap<T6, As6>,
                    DeserializeAsWrap<T7, As7>, DeserializeAsWrap<T8, As8>,
                    DeserializeAsWrap<T9, As9>, DeserializeAsWrap<T10, As10>,
                    DeserializeAsWrap<T11, As11>, DeserializeAsWrap<T12, As12>,
                    DeserializeAsWrap<T13, As13>, DeserializeAsWrap<T14, As14>,
                    DeserializeAsWrap<T15, As15>>(PhantomData))
    }
}tuple_impl!(16 0 T0 As0 1 T1 As1 2 T2 As2 3 T3 As3 4 T4 As4 5 T5 As5 6 T6 As6 7 T7 As7 8 T8 As8 9 T9 As9 10 T10 As10 11 T11 As11 12 T12 As12 13 T13 As13 14 T14 As14 15 T15 As15);
735
736#[cfg(feature = "alloc")]
737macro_rules! map_as_tuple_seq_intern {
738    (
739        $tyorig:ident < K $(: $kbound1:ident $(+ $kbound2:ident)*)?, V $(, $typaram:ident : $bound1:ident $(+ $bound2:ident)*)* >,
740        $with_capacity:expr,
741        $ty:ident <(KAs, VAs)>
742    ) => {
743        impl<'de, K, KAs, V, VAs $(, $typaram)*> DeserializeAs<'de, $tyorig<K, V $(, $typaram)*>> for $ty<(KAs, VAs)>
744        where
745            KAs: DeserializeAs<'de, K>,
746            VAs: DeserializeAs<'de, V>,
747            $(K: $kbound1 $(+ $kbound2)*,)?
748            $($typaram: $bound1 $(+ $bound2)*,)*
749        {
750            fn deserialize_as<D>(deserializer: D) -> Result<$tyorig<K, V $(, $typaram)*>, D::Error>
751            where
752                D: Deserializer<'de>,
753            {
754                struct SeqVisitor<K, KAs, V, VAs $(, $typaram)*> {
755                    marker: PhantomData<(K, KAs, V, VAs $(, $typaram)*)>,
756                }
757
758                impl<'de, K, KAs, V, VAs $(, $typaram)*> Visitor<'de> for SeqVisitor<K, KAs, V, VAs $(, $typaram)*>
759                where
760                    KAs: DeserializeAs<'de, K>,
761                    VAs: DeserializeAs<'de, V>,
762                    $(K: $kbound1 $(+ $kbound2)*,)?
763                    $($typaram: $bound1 $(+ $bound2)*,)*
764                {
765                    type Value = $tyorig<K, V $(, $typaram)*>;
766
767                    fn expecting(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
768                        formatter.write_str("a sequence")
769                    }
770
771                    #[inline]
772                    fn visit_seq<A>(self, access: A) -> Result<Self::Value, A::Error>
773                    where
774                        A: SeqAccess<'de>,
775                    {
776                        let iter = utils::SeqIter::new(access);
777                        iter.map(|res| {
778                            res.map(
779                                |(k, v): (DeserializeAsWrap<K, KAs>, DeserializeAsWrap<V, VAs>)| {
780                                    (k.into_inner(), v.into_inner())
781                                },
782                            )
783                        })
784                        .collect()
785                    }
786                }
787
788                let visitor = SeqVisitor::<K, KAs, V, VAs $(, $typaram)*> {
789                    marker: PhantomData,
790                };
791                deserializer.deserialize_seq(visitor)
792            }
793        }
794    };
795}
796#[cfg(feature = "alloc")]
797macro_rules! map_as_tuple_seq {
798    (
799        $tyorig:ident < K $(: $kbound1:ident $(+ $kbound2:ident)*)?, V $(, $typaram:ident : $bound1:ident $(+ $bound2:ident)*)* >,
800        $with_capacity:expr
801    ) => {
802        map_as_tuple_seq_intern!($tyorig < K $(: $kbound1 $(+ $kbound2)*)? , V $(, $typaram : $bound1 $(+ $bound2)*)* >, $with_capacity, Seq<(KAs, VAs)>);
803        #[cfg(feature = "alloc")]
804        map_as_tuple_seq_intern!($tyorig < K $(: $kbound1 $(+ $kbound2)*)? , V $(, $typaram : $bound1 $(+ $bound2)*)* >, $with_capacity, Vec<(KAs, VAs)>);
805    }
806}
807impl<'de, K, KAs, V, VAs, S> DeserializeAs<'de, IndexMap2<K, V, S>> for
    Vec<(KAs, VAs)> where KAs: DeserializeAs<'de, K>,
    VAs: DeserializeAs<'de, V>, K: Eq + Hash, S: BuildHasher + Default {
    fn deserialize_as<D>(deserializer: D)
        -> Result<IndexMap2<K, V, S>, D::Error> where D: Deserializer<'de> {
        struct SeqVisitor<K, KAs, V, VAs, S> {
            marker: PhantomData<(K, KAs, V, VAs, S)>,
        }
        impl<'de, K, KAs, V, VAs, S> Visitor<'de> for
            SeqVisitor<K, KAs, V, VAs, S> where KAs: DeserializeAs<'de, K>,
            VAs: DeserializeAs<'de, V>, K: Eq + Hash, S: BuildHasher + Default
            {
            type Value = IndexMap2<K, V, S>;
            fn expecting(&self, formatter: &mut fmt::Formatter<'_>)
                -> fmt::Result {
                formatter.write_str("a sequence")
            }
            #[inline]
            fn visit_seq<A>(self, access: A) -> Result<Self::Value, A::Error>
                where A: SeqAccess<'de> {
                let iter = utils::SeqIter::new(access);
                iter.map(|res|
                            {
                                res.map(|(k, v):
                                            (DeserializeAsWrap<K, KAs>, DeserializeAsWrap<V, VAs>)|
                                        { (k.into_inner(), v.into_inner()) })
                            }).collect()
            }
        }
        let visitor = SeqVisitor::<K, KAs, V, VAs, S> { marker: PhantomData };
        deserializer.deserialize_seq(visitor)
    }
}foreach_map!(map_as_tuple_seq);
808
809#[cfg(feature = "alloc")]
810macro_rules! tuple_seq_as_map_impl_intern {
811    (
812        $tyorig:ident < (K, V) $(: $($bound:ident $(+)?)+)? $(, $typaram:ident : $bound1:ident $(+ $bound2:ident)* )* >,
813        $with_capacity:expr,
814        $append:ident,
815        $ty:ident <KAs, VAs>
816    ) => {
817        #[allow(clippy::implicit_hasher)]
818        impl<'de, K, KAs, V, VAs $(, $typaram)*> DeserializeAs<'de, $tyorig < (K, V) $(, $typaram)* >> for $ty<KAs, VAs>
819        where
820            KAs: DeserializeAs<'de, K>,
821            VAs: DeserializeAs<'de, V>,
822            (K, V): $($($bound +)*)?,
823            $($typaram: $bound1 $(+ $bound2)*,)*
824        {
825            fn deserialize_as<D>(deserializer: D) -> Result<$tyorig < (K, V) $(, $typaram)* >, D::Error>
826            where
827                D: Deserializer<'de>,
828            {
829                struct MapVisitor<K, KAs, V, VAs $(, $typaram)*> {
830                    marker: PhantomData<(K, KAs, V, VAs $(, $typaram)*)>,
831                }
832
833                impl<'de, K, KAs, V, VAs $(, $typaram)*> Visitor<'de> for MapVisitor<K, KAs, V, VAs $(, $typaram)*>
834                where
835                    KAs: DeserializeAs<'de, K>,
836                    VAs: DeserializeAs<'de, V>,
837                    (K, V): $($($bound +)*)?,
838                    $($typaram: $bound1 $(+ $bound2)*,)*
839                {
840                    type Value = $tyorig < (K, V) $(, $typaram)* >;
841
842                    fn expecting(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
843                        formatter.write_str("a map")
844                    }
845
846                    #[inline]
847                    fn visit_map<A>(self, access: A) -> Result<Self::Value, A::Error>
848                    where
849                        A: MapAccess<'de>,
850                    {
851                        let iter = utils::MapIter::new(access);
852                        iter.map(|res| {
853                            res.map(
854                                |(k, v): (DeserializeAsWrap<K, KAs>, DeserializeAsWrap<V, VAs>)| {
855                                    (k.into_inner(), v.into_inner())
856                                },
857                            )
858                        })
859                        .collect()
860                    }
861                }
862
863                let visitor = MapVisitor::<K, KAs, V, VAs $(, $typaram)*> {
864                    marker: PhantomData,
865                };
866                deserializer.deserialize_map(visitor)
867            }
868        }
869    }
870}
871#[cfg(feature = "alloc")]
872macro_rules! tuple_seq_as_map_impl {
873    (
874        $tyorig:ident < T $(: $($bound:ident $(+)?)+)? $(, $typaram:ident : $bound1:ident $(+ $bound2:ident)* )* >,
875        $with_capacity:expr,
876        $append:ident
877    ) => {
878        tuple_seq_as_map_impl_intern!($tyorig < (K, V) $(: $($bound +)+)? $(, $typaram: $bound1 $(+ $bound2)*)*>, $with_capacity, $append, Map<KAs, VAs>);
879        #[cfg(feature = "alloc")]
880        tuple_seq_as_map_impl_intern!($tyorig < (K, V) $(: $($bound +)+)? $(, $typaram: $bound1 $(+ $bound2)*)*>, $with_capacity, $append, BTreeMap<KAs, VAs>);
881        #[cfg(feature = "std")]
882        tuple_seq_as_map_impl_intern!($tyorig < (K, V) $(: $($bound +)+)? $(, $typaram: $bound1 $(+ $bound2)*)*>, $with_capacity, $append, HashMap<KAs, VAs>);
883    }
884}
885#[allow(clippy :: implicit_hasher)]
impl<'de, K, KAs, V, VAs> DeserializeAs<'de, VecDeque<(K, V)>> for
    HashMap<KAs, VAs> where KAs: DeserializeAs<'de, K>,
    VAs: DeserializeAs<'de, V>, (K, V): {
    fn deserialize_as<D>(deserializer: D)
        -> Result<VecDeque<(K, V)>, D::Error> where D: Deserializer<'de> {
        struct MapVisitor<K, KAs, V, VAs> {
            marker: PhantomData<(K, KAs, V, VAs)>,
        }
        impl<'de, K, KAs, V, VAs> Visitor<'de> for MapVisitor<K, KAs, V, VAs>
            where KAs: DeserializeAs<'de, K>, VAs: DeserializeAs<'de, V>,
            (K, V): {
            type Value = VecDeque<(K, V)>;
            fn expecting(&self, formatter: &mut fmt::Formatter<'_>)
                -> fmt::Result {
                formatter.write_str("a map")
            }
            #[inline]
            fn visit_map<A>(self, access: A) -> Result<Self::Value, A::Error>
                where A: MapAccess<'de> {
                let iter = utils::MapIter::new(access);
                iter.map(|res|
                            {
                                res.map(|(k, v):
                                            (DeserializeAsWrap<K, KAs>, DeserializeAsWrap<V, VAs>)|
                                        { (k.into_inner(), v.into_inner()) })
                            }).collect()
            }
        }
        let visitor = MapVisitor::<K, KAs, V, VAs> { marker: PhantomData };
        deserializer.deserialize_map(visitor)
    }
}foreach_seq!(tuple_seq_as_map_impl);
886
887// Option does not implement FromIterator directly, so we need a different implementation
888#[cfg(feature = "alloc")]
889macro_rules! tuple_seq_as_map_option_impl {
890    ($ty:ident) => {
891        #[allow(clippy::implicit_hasher)]
892        impl<'de, K, KAs, V, VAs> DeserializeAs<'de, Option<(K, V)>> for $ty<KAs, VAs>
893        where
894            KAs: DeserializeAs<'de, K>,
895            VAs: DeserializeAs<'de, V>,
896        {
897            fn deserialize_as<D>(deserializer: D) -> Result<Option<(K, V)>, D::Error>
898            where
899                D: Deserializer<'de>,
900            {
901                struct MapVisitor<K, KAs, V, VAs> {
902                    marker: PhantomData<(K, KAs, V, VAs)>,
903                }
904
905                impl<'de, K, KAs, V, VAs> Visitor<'de> for MapVisitor<K, KAs, V, VAs>
906                where
907                    KAs: DeserializeAs<'de, K>,
908                    VAs: DeserializeAs<'de, V>,
909                {
910                    type Value = Option<(K, V)>;
911
912                    fn expecting(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
913                        formatter.write_str("a map of size 1")
914                    }
915
916                    #[inline]
917                    fn visit_map<A>(self, access: A) -> Result<Self::Value, A::Error>
918                    where
919                        A: MapAccess<'de>,
920                    {
921                        let iter = utils::MapIter::new(access);
922                        iter.map(|res| {
923                            res.map(
924                                |(k, v): (DeserializeAsWrap<K, KAs>, DeserializeAsWrap<V, VAs>)| {
925                                    (k.into_inner(), v.into_inner())
926                                },
927                            )
928                        })
929                        .next()
930                        .transpose()
931                    }
932                }
933
934                let visitor = MapVisitor::<K, KAs, V, VAs> {
935                    marker: PhantomData,
936                };
937                deserializer.deserialize_map(visitor)
938            }
939        }
940    };
941}
942#[cfg(feature = "alloc")]
943#[allow(clippy :: implicit_hasher)]
impl<'de, K, KAs, V, VAs> DeserializeAs<'de, Option<(K, V)>> for
    BTreeMap<KAs, VAs> where KAs: DeserializeAs<'de, K>,
    VAs: DeserializeAs<'de, V> {
    fn deserialize_as<D>(deserializer: D) -> Result<Option<(K, V)>, D::Error>
        where D: Deserializer<'de> {
        struct MapVisitor<K, KAs, V, VAs> {
            marker: PhantomData<(K, KAs, V, VAs)>,
        }
        impl<'de, K, KAs, V, VAs> Visitor<'de> for MapVisitor<K, KAs, V, VAs>
            where KAs: DeserializeAs<'de, K>, VAs: DeserializeAs<'de, V> {
            type Value = Option<(K, V)>;
            fn expecting(&self, formatter: &mut fmt::Formatter<'_>)
                -> fmt::Result {
                formatter.write_str("a map of size 1")
            }
            #[inline]
            fn visit_map<A>(self, access: A) -> Result<Self::Value, A::Error>
                where A: MapAccess<'de> {
                let iter = utils::MapIter::new(access);
                iter.map(|res|
                                {
                                    res.map(|(k, v):
                                                (DeserializeAsWrap<K, KAs>, DeserializeAsWrap<V, VAs>)|
                                            { (k.into_inner(), v.into_inner()) })
                                }).next().transpose()
            }
        }
        let visitor = MapVisitor::<K, KAs, V, VAs> { marker: PhantomData };
        deserializer.deserialize_map(visitor)
    }
}tuple_seq_as_map_option_impl!(BTreeMap);
944#[cfg(feature = "std")]
945#[allow(clippy :: implicit_hasher)]
impl<'de, K, KAs, V, VAs> DeserializeAs<'de, Option<(K, V)>> for
    HashMap<KAs, VAs> where KAs: DeserializeAs<'de, K>,
    VAs: DeserializeAs<'de, V> {
    fn deserialize_as<D>(deserializer: D) -> Result<Option<(K, V)>, D::Error>
        where D: Deserializer<'de> {
        struct MapVisitor<K, KAs, V, VAs> {
            marker: PhantomData<(K, KAs, V, VAs)>,
        }
        impl<'de, K, KAs, V, VAs> Visitor<'de> for MapVisitor<K, KAs, V, VAs>
            where KAs: DeserializeAs<'de, K>, VAs: DeserializeAs<'de, V> {
            type Value = Option<(K, V)>;
            fn expecting(&self, formatter: &mut fmt::Formatter<'_>)
                -> fmt::Result {
                formatter.write_str("a map of size 1")
            }
            #[inline]
            fn visit_map<A>(self, access: A) -> Result<Self::Value, A::Error>
                where A: MapAccess<'de> {
                let iter = utils::MapIter::new(access);
                iter.map(|res|
                                {
                                    res.map(|(k, v):
                                                (DeserializeAsWrap<K, KAs>, DeserializeAsWrap<V, VAs>)|
                                            { (k.into_inner(), v.into_inner()) })
                                }).next().transpose()
            }
        }
        let visitor = MapVisitor::<K, KAs, V, VAs> { marker: PhantomData };
        deserializer.deserialize_map(visitor)
    }
}tuple_seq_as_map_option_impl!(HashMap);
946
947macro_rules! tuple_seq_as_map_arr {
948    ($ty:ident <KAs, VAs>) => {
949        #[allow(clippy::implicit_hasher)]
950        impl<'de, K, KAs, V, VAs, const N: usize> DeserializeAs<'de, [(K, V); N]> for $ty<KAs, VAs>
951        where
952            KAs: DeserializeAs<'de, K>,
953            VAs: DeserializeAs<'de, V>,
954        {
955            fn deserialize_as<D>(deserializer: D) -> Result<[(K, V); N], D::Error>
956            where
957                D: Deserializer<'de>,
958            {
959                struct MapVisitor<K, KAs, V, VAs, const M: usize> {
960                    marker: PhantomData<(K, KAs, V, VAs)>,
961                }
962
963                impl<'de, K, KAs, V, VAs, const M: usize> Visitor<'de> for MapVisitor<K, KAs, V, VAs, M>
964                where
965                    KAs: DeserializeAs<'de, K>,
966                    VAs: DeserializeAs<'de, V>,
967                {
968                    type Value = [(K, V); M];
969
970                    fn expecting(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
971                        formatter.write_fmt(format_args!("a map of length {}", M))
972                    }
973
974                    fn visit_map<A>(self, access: A) -> Result<Self::Value, A::Error>
975                    where
976                        A: MapAccess<'de>,
977                    {
978                        utils::array_from_iterator(utils::MapIter::new(access).map(
979                            |res: Result<(DeserializeAsWrap<K, KAs>, DeserializeAsWrap<V, VAs>), A::Error>| {
980                                res.map(|(k, v)| (k.into_inner(), v.into_inner()))
981                            }
982                        ), &self)
983                    }
984                }
985
986                let visitor = MapVisitor::<K, KAs, V, VAs, N> {
987                    marker: PhantomData,
988                };
989                deserializer.deserialize_map(visitor)
990            }
991        }
992    }
993}
994#[allow(clippy :: implicit_hasher)]
impl<'de, K, KAs, V, VAs, const N : usize> DeserializeAs<'de, [(K, V); N]> for
    Map<KAs, VAs> where KAs: DeserializeAs<'de, K>, VAs: DeserializeAs<'de, V>
    {
    fn deserialize_as<D>(deserializer: D) -> Result<[(K, V); N], D::Error>
        where D: Deserializer<'de> {
        struct MapVisitor<K, KAs, V, VAs, const M : usize> {
            marker: PhantomData<(K, KAs, V, VAs)>,
        }
        impl<'de, K, KAs, V, VAs, const M : usize> Visitor<'de> for
            MapVisitor<K, KAs, V, VAs, M> where KAs: DeserializeAs<'de, K>,
            VAs: DeserializeAs<'de, V> {
            type Value = [(K, V); M];
            fn expecting(&self, formatter: &mut fmt::Formatter<'_>)
                -> fmt::Result {
                formatter.write_fmt(format_args!("a map of length {0}", M))
            }
            fn visit_map<A>(self, access: A) -> Result<Self::Value, A::Error>
                where A: MapAccess<'de> {
                utils::array_from_iterator(utils::MapIter::new(access).map(|res:
                                Result<(DeserializeAsWrap<K, KAs>,
                                DeserializeAsWrap<V, VAs>), A::Error>|
                            { res.map(|(k, v)| (k.into_inner(), v.into_inner())) }),
                    &self)
            }
        }
        let visitor = MapVisitor::<K, KAs, V, VAs, N> { marker: PhantomData };
        deserializer.deserialize_map(visitor)
    }
}tuple_seq_as_map_arr!(Map<KAs, VAs>);
995#[cfg(feature = "alloc")]
996#[allow(clippy :: implicit_hasher)]
impl<'de, K, KAs, V, VAs, const N : usize> DeserializeAs<'de, [(K, V); N]> for
    BTreeMap<KAs, VAs> where KAs: DeserializeAs<'de, K>,
    VAs: DeserializeAs<'de, V> {
    fn deserialize_as<D>(deserializer: D) -> Result<[(K, V); N], D::Error>
        where D: Deserializer<'de> {
        struct MapVisitor<K, KAs, V, VAs, const M : usize> {
            marker: PhantomData<(K, KAs, V, VAs)>,
        }
        impl<'de, K, KAs, V, VAs, const M : usize> Visitor<'de> for
            MapVisitor<K, KAs, V, VAs, M> where KAs: DeserializeAs<'de, K>,
            VAs: DeserializeAs<'de, V> {
            type Value = [(K, V); M];
            fn expecting(&self, formatter: &mut fmt::Formatter<'_>)
                -> fmt::Result {
                formatter.write_fmt(format_args!("a map of length {0}", M))
            }
            fn visit_map<A>(self, access: A) -> Result<Self::Value, A::Error>
                where A: MapAccess<'de> {
                utils::array_from_iterator(utils::MapIter::new(access).map(|res:
                                Result<(DeserializeAsWrap<K, KAs>,
                                DeserializeAsWrap<V, VAs>), A::Error>|
                            { res.map(|(k, v)| (k.into_inner(), v.into_inner())) }),
                    &self)
            }
        }
        let visitor = MapVisitor::<K, KAs, V, VAs, N> { marker: PhantomData };
        deserializer.deserialize_map(visitor)
    }
}tuple_seq_as_map_arr!(BTreeMap<KAs, VAs>);
997#[cfg(feature = "std")]
998#[allow(clippy :: implicit_hasher)]
impl<'de, K, KAs, V, VAs, const N : usize> DeserializeAs<'de, [(K, V); N]> for
    HashMap<KAs, VAs> where KAs: DeserializeAs<'de, K>,
    VAs: DeserializeAs<'de, V> {
    fn deserialize_as<D>(deserializer: D) -> Result<[(K, V); N], D::Error>
        where D: Deserializer<'de> {
        struct MapVisitor<K, KAs, V, VAs, const M : usize> {
            marker: PhantomData<(K, KAs, V, VAs)>,
        }
        impl<'de, K, KAs, V, VAs, const M : usize> Visitor<'de> for
            MapVisitor<K, KAs, V, VAs, M> where KAs: DeserializeAs<'de, K>,
            VAs: DeserializeAs<'de, V> {
            type Value = [(K, V); M];
            fn expecting(&self, formatter: &mut fmt::Formatter<'_>)
                -> fmt::Result {
                formatter.write_fmt(format_args!("a map of length {0}", M))
            }
            fn visit_map<A>(self, access: A) -> Result<Self::Value, A::Error>
                where A: MapAccess<'de> {
                utils::array_from_iterator(utils::MapIter::new(access).map(|res:
                                Result<(DeserializeAsWrap<K, KAs>,
                                DeserializeAsWrap<V, VAs>), A::Error>|
                            { res.map(|(k, v)| (k.into_inner(), v.into_inner())) }),
                    &self)
            }
        }
        let visitor = MapVisitor::<K, KAs, V, VAs, N> { marker: PhantomData };
        deserializer.deserialize_map(visitor)
    }
}tuple_seq_as_map_arr!(HashMap<KAs, VAs>);
999
1000// endregion
1001///////////////////////////////////////////////////////////////////////////////
1002// region: Conversion types which cause different serialization behavior
1003
1004impl<'de, T: Deserialize<'de>> DeserializeAs<'de, T> for Same {
1005    fn deserialize_as<D>(deserializer: D) -> Result<T, D::Error>
1006    where
1007        D: Deserializer<'de>,
1008    {
1009        T::deserialize(deserializer)
1010    }
1011}
1012
1013impl<'de, T> DeserializeAs<'de, T> for DisplayFromStr
1014where
1015    T: FromStr,
1016    T::Err: Display,
1017{
1018    fn deserialize_as<D>(deserializer: D) -> Result<T, D::Error>
1019    where
1020        D: Deserializer<'de>,
1021    {
1022        struct Helper<S>(PhantomData<S>);
1023        impl<S> Visitor<'_> for Helper<S>
1024        where
1025            S: FromStr,
1026            <S as FromStr>::Err: Display,
1027        {
1028            type Value = S;
1029
1030            fn expecting(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
1031                formatter.write_str("a string")
1032            }
1033
1034            fn visit_str<E>(self, value: &str) -> Result<Self::Value, E>
1035            where
1036                E: DeError,
1037            {
1038                value.parse::<Self::Value>().map_err(DeError::custom)
1039            }
1040        }
1041
1042        deserializer.deserialize_str(Helper(PhantomData))
1043    }
1044}
1045
1046impl<'de, T, H, F> DeserializeAs<'de, T> for IfIsHumanReadable<H, F>
1047where
1048    H: DeserializeAs<'de, T>,
1049    F: DeserializeAs<'de, T>,
1050{
1051    fn deserialize_as<D>(deserializer: D) -> Result<T, D::Error>
1052    where
1053        D: Deserializer<'de>,
1054    {
1055        if deserializer.is_human_readable() {
1056            H::deserialize_as(deserializer)
1057        } else {
1058            F::deserialize_as(deserializer)
1059        }
1060    }
1061}
1062
1063impl<'de, Str> DeserializeAs<'de, Option<Str>> for NoneAsEmptyString
1064where
1065    Str: FromStr,
1066    Str::Err: Display,
1067{
1068    fn deserialize_as<D>(deserializer: D) -> Result<Option<Str>, D::Error>
1069    where
1070        D: Deserializer<'de>,
1071    {
1072        struct OptionStringEmptyNone<S>(PhantomData<S>);
1073        impl<S> Visitor<'_> for OptionStringEmptyNone<S>
1074        where
1075            S: FromStr,
1076            S::Err: Display,
1077        {
1078            type Value = Option<S>;
1079
1080            fn expecting(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
1081                formatter.write_str("a string")
1082            }
1083
1084            fn visit_str<E>(self, value: &str) -> Result<Self::Value, E>
1085            where
1086                E: DeError,
1087            {
1088                match value {
1089                    "" => Ok(None),
1090                    v => S::from_str(v).map(Some).map_err(DeError::custom),
1091                }
1092            }
1093
1094            // handles the `null` case
1095            fn visit_unit<E>(self) -> Result<Self::Value, E>
1096            where
1097                E: DeError,
1098            {
1099                Ok(None)
1100            }
1101        }
1102
1103        deserializer.deserialize_any(OptionStringEmptyNone(PhantomData))
1104    }
1105}
1106
1107#[cfg(feature = "alloc")]
1108impl<'de, T, TAs> DeserializeAs<'de, T> for DefaultOnError<TAs>
1109where
1110    TAs: DeserializeAs<'de, T>,
1111    T: Default,
1112{
1113    fn deserialize_as<D>(deserializer: D) -> Result<T, D::Error>
1114    where
1115        D: Deserializer<'de>,
1116    {
1117        let is_hr = deserializer.is_human_readable();
1118        let content: content::de::Content<'de> = match Deserialize::deserialize(deserializer) {
1119            Ok(content) => content,
1120            Err(_) => return Ok(Default::default()),
1121        };
1122
1123        Ok(
1124            match <DeserializeAsWrap<T, TAs>>::deserialize(content::de::ContentDeserializer::<
1125                D::Error,
1126            >::new(content, is_hr))
1127            {
1128                Ok(elem) => elem.into_inner(),
1129                Err(_) => Default::default(),
1130            },
1131        )
1132    }
1133}
1134
1135#[cfg(feature = "alloc")]
1136impl<'de> DeserializeAs<'de, Vec<u8>> for BytesOrString {
1137    fn deserialize_as<D>(deserializer: D) -> Result<Vec<u8>, D::Error>
1138    where
1139        D: Deserializer<'de>,
1140    {
1141        struct BytesOrStringVisitor;
1142        impl<'de> Visitor<'de> for BytesOrStringVisitor {
1143            type Value = Vec<u8>;
1144
1145            fn expecting(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
1146                formatter.write_str("a list of bytes or a string")
1147            }
1148
1149            fn visit_bytes<E>(self, v: &[u8]) -> Result<Self::Value, E> {
1150                Ok(v.to_vec())
1151            }
1152
1153            #[cfg(feature = "alloc")]
1154            fn visit_byte_buf<E>(self, v: Vec<u8>) -> Result<Self::Value, E> {
1155                Ok(v)
1156            }
1157
1158            fn visit_str<E>(self, v: &str) -> Result<Self::Value, E> {
1159                Ok(v.as_bytes().to_vec())
1160            }
1161
1162            #[cfg(feature = "alloc")]
1163            fn visit_string<E>(self, v: String) -> Result<Self::Value, E> {
1164                Ok(v.into_bytes())
1165            }
1166
1167            fn visit_seq<A>(self, seq: A) -> Result<Self::Value, A::Error>
1168            where
1169                A: SeqAccess<'de>,
1170            {
1171                utils::SeqIter::new(seq).collect()
1172            }
1173        }
1174        deserializer.deserialize_any(BytesOrStringVisitor)
1175    }
1176}
1177
1178impl<'de, SEPARATOR, I, T> DeserializeAs<'de, I> for StringWithSeparator<SEPARATOR, T>
1179where
1180    SEPARATOR: Separator,
1181    I: FromIterator<T>,
1182    T: FromStr,
1183    T::Err: Display,
1184{
1185    fn deserialize_as<D>(deserializer: D) -> Result<I, D::Error>
1186    where
1187        D: Deserializer<'de>,
1188    {
1189        struct Helper<SEPARATOR, I, T>(PhantomData<(SEPARATOR, I, T)>);
1190
1191        impl<SEPARATOR, I, T> Visitor<'_> for Helper<SEPARATOR, I, T>
1192        where
1193            SEPARATOR: Separator,
1194            I: FromIterator<T>,
1195            T: FromStr,
1196            T::Err: Display,
1197        {
1198            type Value = I;
1199
1200            fn expecting(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
1201                formatter.write_str("a string")
1202            }
1203
1204            fn visit_str<E>(self, value: &str) -> Result<Self::Value, E>
1205            where
1206                E: DeError,
1207            {
1208                if value.is_empty() {
1209                    Ok(None.into_iter().collect())
1210                } else {
1211                    value
1212                        .split(SEPARATOR::separator())
1213                        .map(FromStr::from_str)
1214                        .collect::<Result<_, _>>()
1215                        .map_err(DeError::custom)
1216                }
1217            }
1218        }
1219
1220        deserializer.deserialize_str(Helper::<SEPARATOR, I, T>(PhantomData))
1221    }
1222}
1223
1224macro_rules! use_signed_duration {
1225    (
1226        $main_trait:ident $internal_trait:ident =>
1227        {
1228            $ty:ty; $converter:ident =>
1229            $({
1230                $format:ty, $strictness:ty =>
1231                $($tbound:ident: $bound:ident $(,)?)*
1232            })*
1233        }
1234    ) => {
1235        $(
1236            impl<'de, $($tbound,)*> DeserializeAs<'de, $ty> for $main_trait<$format, $strictness>
1237            where
1238                $($tbound: $bound,)*
1239            {
1240                fn deserialize_as<D>(deserializer: D) -> Result<$ty, D::Error>
1241                where
1242                    D: Deserializer<'de>,
1243                {
1244                    let dur: DurationSigned = $internal_trait::<$format, $strictness>::deserialize_as(deserializer)?;
1245                    dur.$converter::<D>()
1246                }
1247            }
1248        )*
1249    };
1250    (
1251        $( $main_trait:ident $internal_trait:ident, )+ => $rest:tt
1252    ) => {
1253        $( use_signed_duration!($main_trait $internal_trait => $rest); )+
1254    };
1255}
1256
1257impl<'de, FORMAT> DeserializeAs<'de, Duration> for
    DurationNanoSeconds<FORMAT, Flexible> where FORMAT: Format {
    fn deserialize_as<D>(deserializer: D) -> Result<Duration, D::Error> where
        D: Deserializer<'de> {
        let dur: DurationSigned =
            DurationNanoSeconds::<FORMAT,
                        Flexible>::deserialize_as(deserializer)?;
        dur.to_std_duration::<D>()
    }
}use_signed_duration!(
1258    DurationSeconds DurationSeconds,
1259    DurationMilliSeconds DurationMilliSeconds,
1260    DurationMicroSeconds DurationMicroSeconds,
1261    DurationNanoSeconds DurationNanoSeconds,
1262    => {
1263        Duration; to_std_duration =>
1264        {u64, Strict =>}
1265        {FORMAT, Flexible => FORMAT: Format}
1266    }
1267);
1268#[cfg(feature = "alloc")]
1269impl<'de> DeserializeAs<'de, Duration> for DurationNanoSeconds<String, Strict>
    where  {
    fn deserialize_as<D>(deserializer: D) -> Result<Duration, D::Error> where
        D: Deserializer<'de> {
        let dur: DurationSigned =
            DurationNanoSeconds::<String,
                        Strict>::deserialize_as(deserializer)?;
        dur.to_std_duration::<D>()
    }
}use_signed_duration!(
1270    DurationSeconds DurationSeconds,
1271    DurationMilliSeconds DurationMilliSeconds,
1272    DurationMicroSeconds DurationMicroSeconds,
1273    DurationNanoSeconds DurationNanoSeconds,
1274    => {
1275        Duration; to_std_duration =>
1276        {String, Strict =>}
1277    }
1278);
1279#[cfg(feature = "std")]
1280impl<'de> DeserializeAs<'de, Duration> for DurationNanoSeconds<f64, Strict>
    where  {
    fn deserialize_as<D>(deserializer: D) -> Result<Duration, D::Error> where
        D: Deserializer<'de> {
        let dur: DurationSigned =
            DurationNanoSeconds::<f64, Strict>::deserialize_as(deserializer)?;
        dur.to_std_duration::<D>()
    }
}use_signed_duration!(
1281    DurationSeconds DurationSeconds,
1282    DurationMilliSeconds DurationMilliSeconds,
1283    DurationMicroSeconds DurationMicroSeconds,
1284    DurationNanoSeconds DurationNanoSeconds,
1285    => {
1286        Duration; to_std_duration =>
1287        // round() only works on std
1288        {f64, Strict =>}
1289    }
1290);
1291impl<'de, FORMAT> DeserializeAs<'de, Duration> for
    DurationNanoSecondsWithFrac<FORMAT, Flexible> where FORMAT: Format {
    fn deserialize_as<D>(deserializer: D) -> Result<Duration, D::Error> where
        D: Deserializer<'de> {
        let dur: DurationSigned =
            DurationNanoSecondsWithFrac::<FORMAT,
                        Flexible>::deserialize_as(deserializer)?;
        dur.to_std_duration::<D>()
    }
}use_signed_duration!(
1292    DurationSecondsWithFrac DurationSecondsWithFrac,
1293    DurationMilliSecondsWithFrac DurationMilliSecondsWithFrac,
1294    DurationMicroSecondsWithFrac DurationMicroSecondsWithFrac,
1295    DurationNanoSecondsWithFrac DurationNanoSecondsWithFrac,
1296    => {
1297        Duration; to_std_duration =>
1298        {f64, Strict =>}
1299        {FORMAT, Flexible => FORMAT: Format}
1300    }
1301);
1302#[cfg(feature = "alloc")]
1303impl<'de> DeserializeAs<'de, Duration> for
    DurationNanoSecondsWithFrac<String, Strict> where  {
    fn deserialize_as<D>(deserializer: D) -> Result<Duration, D::Error> where
        D: Deserializer<'de> {
        let dur: DurationSigned =
            DurationNanoSecondsWithFrac::<String,
                        Strict>::deserialize_as(deserializer)?;
        dur.to_std_duration::<D>()
    }
}use_signed_duration!(
1304    DurationSecondsWithFrac DurationSecondsWithFrac,
1305    DurationMilliSecondsWithFrac DurationMilliSecondsWithFrac,
1306    DurationMicroSecondsWithFrac DurationMicroSecondsWithFrac,
1307    DurationNanoSecondsWithFrac DurationNanoSecondsWithFrac,
1308    => {
1309        Duration; to_std_duration =>
1310        {String, Strict =>}
1311    }
1312);
1313
1314#[cfg(feature = "std")]
1315impl<'de, FORMAT> DeserializeAs<'de, SystemTime> for
    TimestampNanoSeconds<FORMAT, Flexible> where FORMAT: Format {
    fn deserialize_as<D>(deserializer: D) -> Result<SystemTime, D::Error>
        where D: Deserializer<'de> {
        let dur: DurationSigned =
            DurationNanoSeconds::<FORMAT,
                        Flexible>::deserialize_as(deserializer)?;
        dur.to_system_time::<D>()
    }
}use_signed_duration!(
1316    TimestampSeconds DurationSeconds,
1317    TimestampMilliSeconds DurationMilliSeconds,
1318    TimestampMicroSeconds DurationMicroSeconds,
1319    TimestampNanoSeconds DurationNanoSeconds,
1320    => {
1321        SystemTime; to_system_time =>
1322        {i64, Strict =>}
1323        {f64, Strict =>}
1324        {String, Strict =>}
1325        {FORMAT, Flexible => FORMAT: Format}
1326    }
1327);
1328#[cfg(feature = "std")]
1329impl<'de, FORMAT> DeserializeAs<'de, SystemTime> for
    TimestampNanoSecondsWithFrac<FORMAT, Flexible> where FORMAT: Format {
    fn deserialize_as<D>(deserializer: D) -> Result<SystemTime, D::Error>
        where D: Deserializer<'de> {
        let dur: DurationSigned =
            DurationNanoSecondsWithFrac::<FORMAT,
                        Flexible>::deserialize_as(deserializer)?;
        dur.to_system_time::<D>()
    }
}use_signed_duration!(
1330    TimestampSecondsWithFrac DurationSecondsWithFrac,
1331    TimestampMilliSecondsWithFrac DurationMilliSecondsWithFrac,
1332    TimestampMicroSecondsWithFrac DurationMicroSecondsWithFrac,
1333    TimestampNanoSecondsWithFrac DurationNanoSecondsWithFrac,
1334    => {
1335        SystemTime; to_system_time =>
1336        {f64, Strict =>}
1337        {String, Strict =>}
1338        {FORMAT, Flexible => FORMAT: Format}
1339    }
1340);
1341
1342impl<'de, T, U> DeserializeAs<'de, T> for DefaultOnNull<U>
1343where
1344    U: DeserializeAs<'de, T>,
1345    T: Default,
1346{
1347    fn deserialize_as<D>(deserializer: D) -> Result<T, D::Error>
1348    where
1349        D: Deserializer<'de>,
1350    {
1351        Ok(Option::<U>::deserialize_as(deserializer)?.unwrap_or_default())
1352    }
1353}
1354
1355impl<'de> DeserializeAs<'de, &'de [u8]> for Bytes {
1356    fn deserialize_as<D>(deserializer: D) -> Result<&'de [u8], D::Error>
1357    where
1358        D: Deserializer<'de>,
1359    {
1360        <&'de [u8]>::deserialize(deserializer)
1361    }
1362}
1363
1364// serde_bytes implementation for ByteBuf
1365// https://github.com/serde-rs/bytes/blob/cbae606b9dc225fc094b031cc84eac9493da2058/src/bytebuf.rs#L196
1366//
1367// Implements:
1368// * visit_seq
1369// * visit_bytes
1370// * visit_byte_buf
1371// * visit_str
1372// * visit_string
1373#[cfg(feature = "alloc")]
1374impl<'de> DeserializeAs<'de, Vec<u8>> for Bytes {
1375    fn deserialize_as<D>(deserializer: D) -> Result<Vec<u8>, D::Error>
1376    where
1377        D: Deserializer<'de>,
1378    {
1379        struct VecVisitor;
1380
1381        impl<'de> Visitor<'de> for VecVisitor {
1382            type Value = Vec<u8>;
1383
1384            fn expecting(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
1385                formatter.write_str("a byte array")
1386            }
1387
1388            fn visit_seq<A>(self, seq: A) -> Result<Self::Value, A::Error>
1389            where
1390                A: SeqAccess<'de>,
1391            {
1392                utils::SeqIter::new(seq).collect::<Result<_, _>>()
1393            }
1394
1395            fn visit_bytes<E>(self, v: &[u8]) -> Result<Self::Value, E>
1396            where
1397                E: DeError,
1398            {
1399                Ok(v.to_vec())
1400            }
1401
1402            fn visit_byte_buf<E>(self, v: Vec<u8>) -> Result<Self::Value, E>
1403            where
1404                E: DeError,
1405            {
1406                Ok(v)
1407            }
1408
1409            fn visit_str<E>(self, v: &str) -> Result<Self::Value, E>
1410            where
1411                E: DeError,
1412            {
1413                Ok(v.as_bytes().to_vec())
1414            }
1415
1416            fn visit_string<E>(self, v: String) -> Result<Self::Value, E>
1417            where
1418                E: DeError,
1419            {
1420                Ok(v.into_bytes())
1421            }
1422        }
1423
1424        deserializer.deserialize_byte_buf(VecVisitor)
1425    }
1426}
1427
1428#[cfg(feature = "alloc")]
1429impl<'de> DeserializeAs<'de, Box<[u8]>> for Bytes {
1430    fn deserialize_as<D>(deserializer: D) -> Result<Box<[u8]>, D::Error>
1431    where
1432        D: Deserializer<'de>,
1433    {
1434        <Bytes as DeserializeAs<'de, Vec<u8>>>::deserialize_as(deserializer)
1435            .map(Vec::into_boxed_slice)
1436    }
1437}
1438
1439// serde_bytes implementation for Cow<'a, [u8]>
1440// https://github.com/serde-rs/bytes/blob/cbae606b9dc225fc094b031cc84eac9493da2058/src/de.rs#L77
1441//
1442// Implements:
1443// * visit_borrowed_bytes
1444// * visit_borrowed_str
1445// * visit_bytes
1446// * visit_str
1447// * visit_byte_buf
1448// * visit_string
1449// * visit_seq
1450#[cfg(feature = "alloc")]
1451impl<'de> DeserializeAs<'de, Cow<'de, [u8]>> for Bytes {
1452    fn deserialize_as<D>(deserializer: D) -> Result<Cow<'de, [u8]>, D::Error>
1453    where
1454        D: Deserializer<'de>,
1455    {
1456        struct CowVisitor;
1457
1458        impl<'de> Visitor<'de> for CowVisitor {
1459            type Value = Cow<'de, [u8]>;
1460
1461            fn expecting(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
1462                formatter.write_str("a byte array")
1463            }
1464
1465            fn visit_borrowed_bytes<E>(self, v: &'de [u8]) -> Result<Self::Value, E>
1466            where
1467                E: DeError,
1468            {
1469                Ok(Cow::Borrowed(v))
1470            }
1471
1472            fn visit_borrowed_str<E>(self, v: &'de str) -> Result<Self::Value, E>
1473            where
1474                E: DeError,
1475            {
1476                Ok(Cow::Borrowed(v.as_bytes()))
1477            }
1478
1479            fn visit_bytes<E>(self, v: &[u8]) -> Result<Self::Value, E>
1480            where
1481                E: DeError,
1482            {
1483                Ok(Cow::Owned(v.to_vec()))
1484            }
1485
1486            fn visit_str<E>(self, v: &str) -> Result<Self::Value, E>
1487            where
1488                E: DeError,
1489            {
1490                Ok(Cow::Owned(v.as_bytes().to_vec()))
1491            }
1492
1493            fn visit_byte_buf<E>(self, v: Vec<u8>) -> Result<Self::Value, E>
1494            where
1495                E: DeError,
1496            {
1497                Ok(Cow::Owned(v))
1498            }
1499
1500            fn visit_string<E>(self, v: String) -> Result<Self::Value, E>
1501            where
1502                E: DeError,
1503            {
1504                Ok(Cow::Owned(v.into_bytes()))
1505            }
1506
1507            fn visit_seq<V>(self, seq: V) -> Result<Self::Value, V::Error>
1508            where
1509                V: SeqAccess<'de>,
1510            {
1511                Ok(Cow::Owned(
1512                    utils::SeqIter::new(seq).collect::<Result<_, _>>()?,
1513                ))
1514            }
1515        }
1516
1517        deserializer.deserialize_bytes(CowVisitor)
1518    }
1519}
1520
1521impl<'de, const N: usize> DeserializeAs<'de, [u8; N]> for Bytes {
1522    fn deserialize_as<D>(deserializer: D) -> Result<[u8; N], D::Error>
1523    where
1524        D: Deserializer<'de>,
1525    {
1526        struct ArrayVisitor<const M: usize>;
1527
1528        impl<'de, const M: usize> Visitor<'de> for ArrayVisitor<M> {
1529            type Value = [u8; M];
1530
1531            fn expecting(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
1532                formatter.write_fmt(format_args!("an byte array of size {0}", M)format_args!("an byte array of size {M}"))
1533            }
1534
1535            fn visit_seq<A>(self, seq: A) -> Result<Self::Value, A::Error>
1536            where
1537                A: SeqAccess<'de>,
1538            {
1539                utils::array_from_iterator(utils::SeqIter::new(seq), &self)
1540            }
1541
1542            fn visit_bytes<E>(self, v: &[u8]) -> Result<Self::Value, E>
1543            where
1544                E: DeError,
1545            {
1546                v.try_into()
1547                    .map_err(|_| DeError::invalid_length(v.len(), &self))
1548            }
1549
1550            fn visit_str<E>(self, v: &str) -> Result<Self::Value, E>
1551            where
1552                E: DeError,
1553            {
1554                v.as_bytes()
1555                    .try_into()
1556                    .map_err(|_| DeError::invalid_length(v.len(), &self))
1557            }
1558        }
1559
1560        deserializer.deserialize_bytes(ArrayVisitor::<N>)
1561    }
1562}
1563
1564impl<'de, const N: usize> DeserializeAs<'de, &'de [u8; N]> for Bytes {
1565    fn deserialize_as<D>(deserializer: D) -> Result<&'de [u8; N], D::Error>
1566    where
1567        D: Deserializer<'de>,
1568    {
1569        struct ArrayVisitor<const M: usize>;
1570
1571        impl<'de, const M: usize> Visitor<'de> for ArrayVisitor<M> {
1572            type Value = &'de [u8; M];
1573
1574            fn expecting(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
1575                formatter.write_fmt(format_args!("a borrowed byte array of size {0}", M)format_args!("a borrowed byte array of size {M}"))
1576            }
1577
1578            fn visit_borrowed_bytes<E>(self, v: &'de [u8]) -> Result<Self::Value, E>
1579            where
1580                E: DeError,
1581            {
1582                v.try_into()
1583                    .map_err(|_| DeError::invalid_length(v.len(), &self))
1584            }
1585
1586            fn visit_borrowed_str<E>(self, v: &'de str) -> Result<Self::Value, E>
1587            where
1588                E: DeError,
1589            {
1590                v.as_bytes()
1591                    .try_into()
1592                    .map_err(|_| DeError::invalid_length(v.len(), &self))
1593            }
1594        }
1595
1596        deserializer.deserialize_bytes(ArrayVisitor::<N>)
1597    }
1598}
1599
1600#[cfg(feature = "alloc")]
1601impl<'de, const N: usize> DeserializeAs<'de, Cow<'de, [u8; N]>> for Bytes {
1602    fn deserialize_as<D>(deserializer: D) -> Result<Cow<'de, [u8; N]>, D::Error>
1603    where
1604        D: Deserializer<'de>,
1605    {
1606        struct CowVisitor<const M: usize>;
1607
1608        impl<'de, const M: usize> Visitor<'de> for CowVisitor<M> {
1609            type Value = Cow<'de, [u8; M]>;
1610
1611            fn expecting(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
1612                formatter.write_str("a byte array")
1613            }
1614
1615            fn visit_borrowed_bytes<E>(self, v: &'de [u8]) -> Result<Self::Value, E>
1616            where
1617                E: DeError,
1618            {
1619                Ok(Cow::Borrowed(
1620                    v.try_into()
1621                        .map_err(|_| DeError::invalid_length(v.len(), &self))?,
1622                ))
1623            }
1624
1625            fn visit_borrowed_str<E>(self, v: &'de str) -> Result<Self::Value, E>
1626            where
1627                E: DeError,
1628            {
1629                Ok(Cow::Borrowed(
1630                    v.as_bytes()
1631                        .try_into()
1632                        .map_err(|_| DeError::invalid_length(v.len(), &self))?,
1633                ))
1634            }
1635
1636            fn visit_bytes<E>(self, v: &[u8]) -> Result<Self::Value, E>
1637            where
1638                E: DeError,
1639            {
1640                Ok(Cow::Owned(
1641                    v.to_vec()
1642                        .try_into()
1643                        .map_err(|_| DeError::invalid_length(v.len(), &self))?,
1644                ))
1645            }
1646
1647            fn visit_str<E>(self, v: &str) -> Result<Self::Value, E>
1648            where
1649                E: DeError,
1650            {
1651                Ok(Cow::Owned(
1652                    v.as_bytes()
1653                        .to_vec()
1654                        .try_into()
1655                        .map_err(|_| DeError::invalid_length(v.len(), &self))?,
1656                ))
1657            }
1658
1659            fn visit_byte_buf<E>(self, v: Vec<u8>) -> Result<Self::Value, E>
1660            where
1661                E: DeError,
1662            {
1663                let len = v.len();
1664                Ok(Cow::Owned(
1665                    v.try_into()
1666                        .map_err(|_| DeError::invalid_length(len, &self))?,
1667                ))
1668            }
1669
1670            fn visit_string<E>(self, v: String) -> Result<Self::Value, E>
1671            where
1672                E: DeError,
1673            {
1674                let len = v.len();
1675                Ok(Cow::Owned(
1676                    v.into_bytes()
1677                        .try_into()
1678                        .map_err(|_| DeError::invalid_length(len, &self))?,
1679                ))
1680            }
1681
1682            fn visit_seq<V>(self, seq: V) -> Result<Self::Value, V::Error>
1683            where
1684                V: SeqAccess<'de>,
1685            {
1686                Ok(Cow::Owned(utils::array_from_iterator(
1687                    utils::SeqIter::new(seq),
1688                    &self,
1689                )?))
1690            }
1691        }
1692
1693        deserializer.deserialize_bytes(CowVisitor)
1694    }
1695}
1696
1697#[cfg(feature = "alloc")]
1698impl<'de, const N: usize> DeserializeAs<'de, Box<[u8; N]>> for Bytes {
1699    fn deserialize_as<D>(deserializer: D) -> Result<Box<[u8; N]>, D::Error>
1700    where
1701        D: Deserializer<'de>,
1702    {
1703        Bytes::deserialize_as(deserializer).map(Box::new)
1704    }
1705}
1706
1707#[cfg(feature = "alloc")]
1708impl<'de, T, TAs, FORMAT> DeserializeAs<'de, Vec<T>> for OneOrMany<TAs, FORMAT>
1709where
1710    TAs: DeserializeAs<'de, T>,
1711    FORMAT: Format,
1712{
1713    fn deserialize_as<D>(deserializer: D) -> Result<Vec<T>, D::Error>
1714    where
1715        D: Deserializer<'de>,
1716    {
1717        let is_hr = deserializer.is_human_readable();
1718        let content: content::de::Content<'de> = Deserialize::deserialize(deserializer)?;
1719
1720        let one_err: D::Error = match <DeserializeAsWrap<T, TAs>>::deserialize(
1721            content::de::ContentRefDeserializer::new(&content, is_hr),
1722        ) {
1723            Ok(one) => return Ok(<[_]>::into_vec(::alloc::boxed::box_new([one.into_inner()]))alloc::vec![one.into_inner()]),
1724            Err(err) => err,
1725        };
1726        let many_err: D::Error = match <DeserializeAsWrap<Vec<T>, Vec<TAs>>>::deserialize(
1727            content::de::ContentDeserializer::new(content, is_hr),
1728        ) {
1729            Ok(many) => return Ok(many.into_inner()),
1730            Err(err) => err,
1731        };
1732        Err(DeError::custom(format_args!("OneOrMany could not deserialize any variant:\n  One: {0}\n  Many: {1}",
    one_err, many_err)format_args!(
1733            "OneOrMany could not deserialize any variant:\n  One: {one_err}\n  Many: {many_err}"
1734        )))
1735    }
1736}
1737
1738#[cfg(feature = "alloc")]
1739impl<'de, T, TAs1> DeserializeAs<'de, T> for PickFirst<(TAs1,)>
1740where
1741    TAs1: DeserializeAs<'de, T>,
1742{
1743    fn deserialize_as<D>(deserializer: D) -> Result<T, D::Error>
1744    where
1745        D: Deserializer<'de>,
1746    {
1747        Ok(DeserializeAsWrap::<T, TAs1>::deserialize(deserializer)?.into_inner())
1748    }
1749}
1750
1751#[cfg(feature = "alloc")]
1752impl<'de, T, TAs1, TAs2> DeserializeAs<'de, T> for PickFirst<(TAs1, TAs2)>
1753where
1754    TAs1: DeserializeAs<'de, T>,
1755    TAs2: DeserializeAs<'de, T>,
1756{
1757    fn deserialize_as<D>(deserializer: D) -> Result<T, D::Error>
1758    where
1759        D: Deserializer<'de>,
1760    {
1761        let is_hr = deserializer.is_human_readable();
1762        let content: content::de::Content<'de> = Deserialize::deserialize(deserializer)?;
1763
1764        let first_err: D::Error = match <DeserializeAsWrap<T, TAs1>>::deserialize(
1765            content::de::ContentRefDeserializer::new(&content, is_hr),
1766        ) {
1767            Ok(first) => return Ok(first.into_inner()),
1768            Err(err) => err,
1769        };
1770        let second_err: D::Error = match <DeserializeAsWrap<T, TAs2>>::deserialize(
1771            content::de::ContentDeserializer::new(content, is_hr),
1772        ) {
1773            Ok(second) => return Ok(second.into_inner()),
1774            Err(err) => err,
1775        };
1776        Err(DeError::custom(format_args!("PickFirst could not deserialize any variant:\n  First: {0}\n  Second: {1}",
    first_err, second_err)format_args!(
1777            "PickFirst could not deserialize any variant:\n  First: {first_err}\n  Second: {second_err}"
1778        )))
1779    }
1780}
1781
1782#[cfg(feature = "alloc")]
1783impl<'de, T, TAs1, TAs2, TAs3> DeserializeAs<'de, T> for PickFirst<(TAs1, TAs2, TAs3)>
1784where
1785    TAs1: DeserializeAs<'de, T>,
1786    TAs2: DeserializeAs<'de, T>,
1787    TAs3: DeserializeAs<'de, T>,
1788{
1789    fn deserialize_as<D>(deserializer: D) -> Result<T, D::Error>
1790    where
1791        D: Deserializer<'de>,
1792    {
1793        let is_hr = deserializer.is_human_readable();
1794        let content: content::de::Content<'de> = Deserialize::deserialize(deserializer)?;
1795
1796        let first_err: D::Error = match <DeserializeAsWrap<T, TAs1>>::deserialize(
1797            content::de::ContentRefDeserializer::new(&content, is_hr),
1798        ) {
1799            Ok(first) => return Ok(first.into_inner()),
1800            Err(err) => err,
1801        };
1802        let second_err: D::Error = match <DeserializeAsWrap<T, TAs2>>::deserialize(
1803            content::de::ContentRefDeserializer::new(&content, is_hr),
1804        ) {
1805            Ok(second) => return Ok(second.into_inner()),
1806            Err(err) => err,
1807        };
1808        let third_err: D::Error = match <DeserializeAsWrap<T, TAs3>>::deserialize(
1809            content::de::ContentDeserializer::new(content, is_hr),
1810        ) {
1811            Ok(third) => return Ok(third.into_inner()),
1812            Err(err) => err,
1813        };
1814        Err(DeError::custom(format_args!("PickFirst could not deserialize any variant:\n  First: {0}\n  Second: {1}\n  Third: {2}",
    first_err, second_err, third_err)format_args!(
1815            "PickFirst could not deserialize any variant:\n  First: {first_err}\n  Second: {second_err}\n  Third: {third_err}",
1816        )))
1817    }
1818}
1819
1820#[cfg(feature = "alloc")]
1821impl<'de, T, TAs1, TAs2, TAs3, TAs4> DeserializeAs<'de, T> for PickFirst<(TAs1, TAs2, TAs3, TAs4)>
1822where
1823    TAs1: DeserializeAs<'de, T>,
1824    TAs2: DeserializeAs<'de, T>,
1825    TAs3: DeserializeAs<'de, T>,
1826    TAs4: DeserializeAs<'de, T>,
1827{
1828    fn deserialize_as<D>(deserializer: D) -> Result<T, D::Error>
1829    where
1830        D: Deserializer<'de>,
1831    {
1832        let is_hr = deserializer.is_human_readable();
1833        let content: content::de::Content<'de> = Deserialize::deserialize(deserializer)?;
1834
1835        let first_err: D::Error = match <DeserializeAsWrap<T, TAs1>>::deserialize(
1836            content::de::ContentRefDeserializer::new(&content, is_hr),
1837        ) {
1838            Ok(first) => return Ok(first.into_inner()),
1839            Err(err) => err,
1840        };
1841        let second_err: D::Error = match <DeserializeAsWrap<T, TAs2>>::deserialize(
1842            content::de::ContentRefDeserializer::new(&content, is_hr),
1843        ) {
1844            Ok(second) => return Ok(second.into_inner()),
1845            Err(err) => err,
1846        };
1847        let third_err: D::Error = match <DeserializeAsWrap<T, TAs3>>::deserialize(
1848            content::de::ContentRefDeserializer::new(&content, is_hr),
1849        ) {
1850            Ok(third) => return Ok(third.into_inner()),
1851            Err(err) => err,
1852        };
1853        let fourth_err: D::Error = match <DeserializeAsWrap<T, TAs4>>::deserialize(
1854            content::de::ContentDeserializer::new(content, is_hr),
1855        ) {
1856            Ok(fourth) => return Ok(fourth.into_inner()),
1857            Err(err) => err,
1858        };
1859        Err(DeError::custom(format_args!("PickFirst could not deserialize any variant:\n  First: {0}\n  Second: {1}\n  Third: {2}\n  Fourth: {3}",
    first_err, second_err, third_err, fourth_err)format_args!(
1860            "PickFirst could not deserialize any variant:\n  First: {first_err}\n  Second: {second_err}\n  Third: {third_err}\n  Fourth: {fourth_err}",
1861        )))
1862    }
1863}
1864
1865impl<'de, T, U> DeserializeAs<'de, T> for FromInto<U>
1866where
1867    U: Into<T>,
1868    U: Deserialize<'de>,
1869{
1870    fn deserialize_as<D>(deserializer: D) -> Result<T, D::Error>
1871    where
1872        D: Deserializer<'de>,
1873    {
1874        Ok(U::deserialize(deserializer)?.into())
1875    }
1876}
1877
1878impl<'de, T, U> DeserializeAs<'de, T> for TryFromInto<U>
1879where
1880    U: TryInto<T>,
1881    <U as TryInto<T>>::Error: Display,
1882    U: Deserialize<'de>,
1883{
1884    fn deserialize_as<D>(deserializer: D) -> Result<T, D::Error>
1885    where
1886        D: Deserializer<'de>,
1887    {
1888        U::deserialize(deserializer)?
1889            .try_into()
1890            .map_err(DeError::custom)
1891    }
1892}
1893
1894impl<'de, T, U> DeserializeAs<'de, T> for FromIntoRef<U>
1895where
1896    U: Into<T>,
1897    U: Deserialize<'de>,
1898{
1899    fn deserialize_as<D>(deserializer: D) -> Result<T, D::Error>
1900    where
1901        D: Deserializer<'de>,
1902    {
1903        Ok(U::deserialize(deserializer)?.into())
1904    }
1905}
1906
1907impl<'de, T, U> DeserializeAs<'de, T> for TryFromIntoRef<U>
1908where
1909    U: TryInto<T>,
1910    <U as TryInto<T>>::Error: Display,
1911    U: Deserialize<'de>,
1912{
1913    fn deserialize_as<D>(deserializer: D) -> Result<T, D::Error>
1914    where
1915        D: Deserializer<'de>,
1916    {
1917        U::deserialize(deserializer)?
1918            .try_into()
1919            .map_err(DeError::custom)
1920    }
1921}
1922
1923#[cfg(feature = "alloc")]
1924impl<'de> DeserializeAs<'de, Cow<'de, str>> for BorrowCow {
1925    fn deserialize_as<D>(deserializer: D) -> Result<Cow<'de, str>, D::Error>
1926    where
1927        D: Deserializer<'de>,
1928    {
1929        struct CowVisitor;
1930
1931        impl<'de> Visitor<'de> for CowVisitor {
1932            type Value = Cow<'de, str>;
1933
1934            fn expecting(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
1935                formatter.write_str("an optionally borrowed string")
1936            }
1937
1938            fn visit_borrowed_str<E>(self, v: &'de str) -> Result<Self::Value, E>
1939            where
1940                E: DeError,
1941            {
1942                Ok(Cow::Borrowed(v))
1943            }
1944
1945            fn visit_str<E>(self, v: &str) -> Result<Self::Value, E>
1946            where
1947                E: DeError,
1948            {
1949                Ok(Cow::Owned(v.to_owned()))
1950            }
1951
1952            fn visit_string<E>(self, v: String) -> Result<Self::Value, E>
1953            where
1954                E: DeError,
1955            {
1956                Ok(Cow::Owned(v))
1957            }
1958        }
1959
1960        deserializer.deserialize_string(CowVisitor)
1961    }
1962}
1963
1964#[cfg(feature = "alloc")]
1965impl<'de> DeserializeAs<'de, Cow<'de, [u8]>> for BorrowCow {
1966    fn deserialize_as<D>(deserializer: D) -> Result<Cow<'de, [u8]>, D::Error>
1967    where
1968        D: Deserializer<'de>,
1969    {
1970        Bytes::deserialize_as(deserializer)
1971    }
1972}
1973
1974#[cfg(feature = "alloc")]
1975impl<'de, const N: usize> DeserializeAs<'de, Cow<'de, [u8; N]>> for BorrowCow {
1976    fn deserialize_as<D>(deserializer: D) -> Result<Cow<'de, [u8; N]>, D::Error>
1977    where
1978        D: Deserializer<'de>,
1979    {
1980        Bytes::deserialize_as(deserializer)
1981    }
1982}
1983
1984impl<'de> DeserializeAs<'de, bool> for BoolFromInt<Strict> {
1985    fn deserialize_as<D>(deserializer: D) -> Result<bool, D::Error>
1986    where
1987        D: Deserializer<'de>,
1988    {
1989        struct U8Visitor;
1990        impl Visitor<'_> for U8Visitor {
1991            type Value = bool;
1992
1993            fn expecting(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
1994                formatter.write_str("an integer 0 or 1")
1995            }
1996
1997            fn visit_u8<E>(self, v: u8) -> Result<Self::Value, E>
1998            where
1999                E: DeError,
2000            {
2001                match v {
2002                    0 => Ok(false),
2003                    1 => Ok(true),
2004                    unexp => Err(DeError::invalid_value(
2005                        Unexpected::Unsigned(u64::from(unexp)),
2006                        &"0 or 1",
2007                    )),
2008                }
2009            }
2010
2011            fn visit_i8<E>(self, v: i8) -> Result<Self::Value, E>
2012            where
2013                E: DeError,
2014            {
2015                match v {
2016                    0 => Ok(false),
2017                    1 => Ok(true),
2018                    unexp => Err(DeError::invalid_value(
2019                        Unexpected::Signed(i64::from(unexp)),
2020                        &"0 or 1",
2021                    )),
2022                }
2023            }
2024
2025            fn visit_u64<E>(self, v: u64) -> Result<Self::Value, E>
2026            where
2027                E: DeError,
2028            {
2029                match v {
2030                    0 => Ok(false),
2031                    1 => Ok(true),
2032                    unexp => Err(DeError::invalid_value(
2033                        Unexpected::Unsigned(unexp),
2034                        &"0 or 1",
2035                    )),
2036                }
2037            }
2038
2039            fn visit_i64<E>(self, v: i64) -> Result<Self::Value, E>
2040            where
2041                E: DeError,
2042            {
2043                match v {
2044                    0 => Ok(false),
2045                    1 => Ok(true),
2046                    unexp => Err(DeError::invalid_value(Unexpected::Signed(unexp), &"0 or 1")),
2047                }
2048            }
2049
2050            fn visit_u128<E>(self, v: u128) -> Result<Self::Value, E>
2051            where
2052                E: DeError,
2053            {
2054                match v {
2055                    0 => Ok(false),
2056                    1 => Ok(true),
2057                    unexp => {
2058                        let mut buf: [u8; 58] = [0u8; 58];
2059                        Err(DeError::invalid_value(
2060                            crate::utils::get_unexpected_u128(unexp, &mut buf),
2061                            &self,
2062                        ))
2063                    }
2064                }
2065            }
2066
2067            fn visit_i128<E>(self, v: i128) -> Result<Self::Value, E>
2068            where
2069                E: DeError,
2070            {
2071                match v {
2072                    0 => Ok(false),
2073                    1 => Ok(true),
2074                    unexp => {
2075                        let mut buf: [u8; 58] = [0u8; 58];
2076                        Err(DeError::invalid_value(
2077                            crate::utils::get_unexpected_i128(unexp, &mut buf),
2078                            &"0 or 1",
2079                        ))
2080                    }
2081                }
2082            }
2083        }
2084
2085        deserializer.deserialize_u8(U8Visitor)
2086    }
2087}
2088
2089impl<'de> DeserializeAs<'de, bool> for BoolFromInt<Flexible> {
2090    fn deserialize_as<D>(deserializer: D) -> Result<bool, D::Error>
2091    where
2092        D: Deserializer<'de>,
2093    {
2094        struct U8Visitor;
2095        impl Visitor<'_> for U8Visitor {
2096            type Value = bool;
2097
2098            fn expecting(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
2099                formatter.write_str("an integer")
2100            }
2101
2102            fn visit_u8<E>(self, v: u8) -> Result<Self::Value, E>
2103            where
2104                E: DeError,
2105            {
2106                Ok(v != 0)
2107            }
2108
2109            fn visit_i8<E>(self, v: i8) -> Result<Self::Value, E>
2110            where
2111                E: DeError,
2112            {
2113                Ok(v != 0)
2114            }
2115
2116            fn visit_u64<E>(self, v: u64) -> Result<Self::Value, E>
2117            where
2118                E: DeError,
2119            {
2120                Ok(v != 0)
2121            }
2122
2123            fn visit_i64<E>(self, v: i64) -> Result<Self::Value, E>
2124            where
2125                E: DeError,
2126            {
2127                Ok(v != 0)
2128            }
2129
2130            fn visit_u128<E>(self, v: u128) -> Result<Self::Value, E>
2131            where
2132                E: DeError,
2133            {
2134                Ok(v != 0)
2135            }
2136
2137            fn visit_i128<E>(self, v: i128) -> Result<Self::Value, E>
2138            where
2139                E: DeError,
2140            {
2141                Ok(v != 0)
2142            }
2143        }
2144
2145        deserializer.deserialize_u8(U8Visitor)
2146    }
2147}
2148
2149// endregion