serde_molecule/
big_array_serde.rs

1// from https://github.com/est31/serde-big-array/blob/master/src/const_generics.rs
2
3use 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        // The allow is needed to support (32 + 33) like expressions
73        #[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}