generic_arraydeque/
serde.rs1use 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}