generic_arraydeque/
serde.rs

1use core::{fmt, marker::PhantomData};
2
3use serde_core::{
4  de::{Error, SeqAccess, Visitor},
5  Deserialize, Deserializer, Serialize, Serializer,
6};
7
8use super::{ArrayLength, GenericArrayDeque};
9
10impl<T: Serialize, N: ArrayLength> Serialize for GenericArrayDeque<T, N> {
11  fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
12  where
13    S: Serializer,
14  {
15    serializer.collect_seq(self)
16  }
17}
18
19impl<'de, T: Deserialize<'de>, N: ArrayLength> Deserialize<'de> for GenericArrayDeque<T, N> {
20  fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
21  where
22    D: Deserializer<'de>,
23  {
24    struct SeqVisitor<T, N: ArrayLength> {
25      marker: PhantomData<(T, N)>,
26    }
27
28    impl<'de, T, N: ArrayLength> Visitor<'de> for SeqVisitor<T, N>
29    where
30      T: Deserialize<'de>,
31    {
32      type Value = GenericArrayDeque<T, N>;
33
34      fn expecting(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
35        formatter.write_str("a sequence")
36      }
37
38      #[inline]
39      fn visit_seq<A>(self, mut seq: A) -> Result<Self::Value, A::Error>
40      where
41        A: SeqAccess<'de>,
42      {
43        let mut values = GenericArrayDeque::<T, N>::new();
44
45        while let Some(value) = seq.next_element()? {
46          if values.push_back(value).is_some() {
47            return Err(Error::custom("sequence length exceeds capacity"));
48          }
49        }
50
51        Ok(values)
52      }
53    }
54
55    let visitor = SeqVisitor {
56      marker: PhantomData,
57    };
58    deserializer.deserialize_seq(visitor)
59  }
60
61  fn deserialize_in_place<D>(deserializer: D, place: &mut Self) -> Result<(), D::Error>
62  where
63    D: Deserializer<'de>,
64  {
65    struct SeqInPlaceVisitor<'a, T, N: ArrayLength>(&'a mut GenericArrayDeque<T, N>);
66
67    impl<'de, T, N: ArrayLength> Visitor<'de> for SeqInPlaceVisitor<'_, T, N>
68    where
69      T: Deserialize<'de>,
70    {
71      type Value = ();
72
73      fn expecting(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
74        formatter.write_str("a sequence")
75      }
76
77      #[inline]
78      fn visit_seq<A>(self, mut seq: A) -> Result<Self::Value, A::Error>
79      where
80        A: SeqAccess<'de>,
81      {
82        self.0.clear();
83
84        while let Some(value) = seq.next_element()? {
85          if self.0.push_back(value).is_some() {
86            return Err(Error::custom("sequence length exceeds capacity"));
87          }
88        }
89
90        Ok(())
91      }
92    }
93
94    deserializer.deserialize_seq(SeqInPlaceVisitor(place))
95  }
96}