]> git.proxmox.com Git - rustc.git/blob - vendor/generic-array/src/impl_serde.rs
New upstream version 1.34.2+dfsg1
[rustc.git] / vendor / generic-array / src / impl_serde.rs
1 //! Serde serialization/deserialization implementation
2
3 use {ArrayLength, GenericArray};
4 use core::fmt;
5 use core::marker::PhantomData;
6 use serde::{Deserialize, Deserializer, Serialize, Serializer};
7 use serde::de::{self, SeqAccess, Visitor};
8
9 impl<T, N> Serialize for GenericArray<T, N>
10 where
11 T: Serialize,
12 N: ArrayLength<T>,
13 {
14 #[inline]
15 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
16 where
17 S: Serializer,
18 {
19 serializer.collect_seq(self.iter())
20 }
21 }
22
23 struct GAVisitor<T, N> {
24 _t: PhantomData<T>,
25 _n: PhantomData<N>,
26 }
27
28 impl<'de, T, N> Visitor<'de> for GAVisitor<T, N>
29 where
30 T: Deserialize<'de> + Default,
31 N: ArrayLength<T>,
32 {
33 type Value = GenericArray<T, N>;
34
35 fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
36 formatter.write_str("struct GenericArray")
37 }
38
39 fn visit_seq<A>(self, mut seq: A) -> Result<GenericArray<T, N>, A::Error>
40 where
41 A: SeqAccess<'de>,
42 {
43 let mut result = GenericArray::default();
44 for i in 0..N::to_usize() {
45 result[i] = seq.next_element()?.ok_or_else(
46 || de::Error::invalid_length(i, &self),
47 )?;
48 }
49 Ok(result)
50 }
51 }
52
53 impl<'de, T, N> Deserialize<'de> for GenericArray<T, N>
54 where
55 T: Deserialize<'de> + Default,
56 N: ArrayLength<T>,
57 {
58 fn deserialize<D>(deserializer: D) -> Result<GenericArray<T, N>, D::Error>
59 where
60 D: Deserializer<'de>,
61 {
62 let visitor = GAVisitor {
63 _t: PhantomData,
64 _n: PhantomData,
65 };
66 deserializer.deserialize_seq(visitor)
67 }
68 }