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}