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))
}
}