sharky-arrayvec 0.5.0

An array backed vector
Documentation
use crate::ArrayVec;

impl<const C: usize, T: serde::Serialize> serde::Serialize for ArrayVec<C, T> {
    #[inline]
    fn serialize<S: serde::Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
        self.as_slice().serialize(s)
    }
}

impl<'de, const C: usize, T: serde::Deserialize<'de>> serde::Deserialize<'de> for ArrayVec<C, T> {
    fn deserialize<D: serde::Deserializer<'de>>(d: D) -> Result<Self, D::Error> {
        struct Visitor<const C: usize, T>(core::marker::PhantomData<T>);

        impl<'de, const C: usize, T: serde::Deserialize<'de>> serde::de::Visitor<'de> for Visitor<C, T> {
            type Value = ArrayVec<C, T>;

            fn expecting(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
                write!(f, "a sequence of at most {C} elements")
            }

            fn visit_seq<A: serde::de::SeqAccess<'de>>(self, mut seq: A) -> Result<Self::Value, A::Error> {
                let mut vec = ArrayVec::new();
                while let Some(elem) = seq.next_element()? {
                    vec.try_push(elem)
                        .map_err(|_| serde::de::Error::invalid_length(C + 1, &self))?;
                }
                Ok(vec)
            }
        }

        d.deserialize_seq(Visitor(std::marker::PhantomData))
    }
}