Skip to main content

sharky_arrayvec/
serde.rs

1use crate::ArrayVec;
2
3impl<const C: usize, T: serde::Serialize> serde::Serialize for ArrayVec<C, T> {
4    #[inline]
5    fn serialize<S: serde::Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
6        self.as_slice().serialize(s)
7    }
8}
9
10impl<'de, const C: usize, T: serde::Deserialize<'de>> serde::Deserialize<'de> for ArrayVec<C, T> {
11    fn deserialize<D: serde::Deserializer<'de>>(d: D) -> Result<Self, D::Error> {
12        struct Visitor<const C: usize, T>(core::marker::PhantomData<T>);
13
14        impl<'de, const C: usize, T: serde::Deserialize<'de>> serde::de::Visitor<'de> for Visitor<C, T> {
15            type Value = ArrayVec<C, T>;
16
17            fn expecting(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
18                write!(f, "a sequence of at most {C} elements")
19            }
20
21            fn visit_seq<A: serde::de::SeqAccess<'de>>(self, mut seq: A) -> Result<Self::Value, A::Error> {
22                let mut vec = ArrayVec::new();
23                while let Some(elem) = seq.next_element()? {
24                    vec.try_push(elem)
25                        .map_err(|_| serde::de::Error::invalid_length(C + 1, &self))?;
26                }
27                Ok(vec)
28            }
29        }
30
31        d.deserialize_seq(Visitor(std::marker::PhantomData))
32    }
33}