serde_molecule/
big_array_serde.rs1use alloc::vec::Vec;
4use core::fmt;
5use core::marker::PhantomData;
6use core::result;
7use serde::de::{Deserialize, Deserializer, Error, SeqAccess, Visitor};
8use serde::ser::{Serialize, SerializeTuple, Serializer};
9
10pub trait BigArray<'de, T>: Sized {
11 fn serialize<S>(&self, serializer: S) -> result::Result<S::Ok, S::Error>
12 where
13 S: Serializer,
14 T: Serialize;
15 fn deserialize<D>(deserializer: D) -> result::Result<Self, D::Error>
16 where
17 D: Deserializer<'de>,
18 T: Deserialize<'de>;
19}
20
21impl<'de, T, const N: usize> BigArray<'de, T> for [T; N] {
22 fn serialize<S>(&self, serializer: S) -> result::Result<S::Ok, S::Error>
23 where
24 S: Serializer,
25 T: Serialize,
26 {
27 let mut seq = serializer.serialize_tuple(self.len())?;
28 for elem in &self[..] {
29 seq.serialize_element(elem)?;
30 }
31 seq.end()
32 }
33
34 fn deserialize<D>(deserializer: D) -> result::Result<Self, D::Error>
35 where
36 D: Deserializer<'de>,
37 T: Deserialize<'de>,
38 {
39 struct ArrayVisitor<T> {
40 element: PhantomData<T>,
41 }
42
43 impl<'de, T, const N: usize> Visitor<'de> for ArrayVisitor<[T; N]>
44 where
45 T: Deserialize<'de>,
46 {
47 type Value = [T; N];
48
49 fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
50 write!(formatter, "an array of length {}", N)
51 }
52
53 fn visit_seq<A>(self, mut seq: A) -> result::Result<[T; N], A::Error>
54 where
55 A: SeqAccess<'de>,
56 {
57 let mut vec = Vec::with_capacity(N);
58 for i in 0..N {
59 let val = seq
60 .next_element()?
61 .ok_or_else(|| Error::invalid_length(i, &self))?;
62 vec.push(val);
63 }
64 vec.try_into()
65 .map_err(|_| Error::custom("Failed to convert Vec to array"))
66 }
67 }
68
69 let visitor = ArrayVisitor {
70 element: PhantomData,
71 };
72 #[allow(unused_parens)]
74 deserializer.deserialize_tuple(N, visitor)
75 }
76}
77
78pub fn serialize<'de, T, S, E>(value: &T, serializer: S) -> Result<S::Ok, S::Error>
79where
80 S: Serializer,
81 E: Serialize,
82 T: BigArray<'de, E>,
83{
84 BigArray::serialize(value, serializer)
85}
86
87pub fn deserialize<'de, D, T, E>(deserializer: D) -> Result<T, D::Error>
88where
89 D: Deserializer<'de>,
90 E: Deserialize<'de>,
91 T: BigArray<'de, E>,
92{
93 BigArray::deserialize(deserializer)
94}