1use alloc::format;
2use core::marker::PhantomData;
3use serde_core::de::{self, SeqAccess, Visitor};
4use serde_core::ser::SerializeSeq;
5use serde_core::{Deserialize, Deserializer, Serialize, Serializer};
6
7#[cfg(feature = "arrayvec")]
8use crate::ArrayVec;
9
10#[cfg(feature = "fastvec")]
11use crate::FastVec;
12
13#[cfg(feature = "smallvec")]
14use crate::SmallVec;
15
16#[cfg(all(feature = "arrayvec", feature = "serde"))]
17impl<T: Serialize, const N: usize> Serialize for ArrayVec<T, N> {
18 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
20 where
21 S: Serializer,
22 {
23 let mut seq = serializer.serialize_seq(Some(self.len()))?;
24 for element in self {
25 seq.serialize_element(element)?;
26 }
27 seq.end()
28 }
29}
30
31#[cfg(all(feature = "fastvec", feature = "serde"))]
32impl<T: Serialize, const N: usize> Serialize for FastVec<T, N> {
33 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
35 where
36 S: Serializer,
37 {
38 let mut seq = serializer.serialize_seq(Some(self.len()))?;
39 for element in self {
40 seq.serialize_element(element)?;
41 }
42 seq.end()
43 }
44}
45
46#[cfg(all(feature = "smallvec", feature = "serde"))]
47impl<T: Serialize, const N: usize> Serialize for SmallVec<T, N> {
48 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
50 where
51 S: Serializer,
52 {
53 let mut seq = serializer.serialize_seq(Some(self.len()))?;
54 for element in self {
55 seq.serialize_element(element)?;
56 }
57 seq.end()
58 }
59}
60
61#[cfg(all(feature = "arrayvec", feature = "serde"))]
62impl<'de, T: Deserialize<'de>, const N: usize> Deserialize<'de> for ArrayVec<T, N> {
63 #[inline]
68 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
69 where
70 D: Deserializer<'de>,
71 {
72 struct ArrayVecVisitor<T, const N: usize> {
73 _marker: PhantomData<T>,
74 }
75
76 impl<'de, T: Deserialize<'de>, const N: usize> Visitor<'de> for ArrayVecVisitor<T, N> {
77 type Value = ArrayVec<T, N>;
78
79 fn expecting(&self, formatter: &mut core::fmt::Formatter) -> core::fmt::Result {
80 formatter.write_str("a sequence")
81 }
82
83 fn visit_seq<A>(self, mut seq: A) -> Result<Self::Value, A::Error>
84 where
85 A: SeqAccess<'de>,
86 {
87 let mut vec = ArrayVec::new();
88
89 while let Some(element) = seq.next_element()? {
90 if vec.len() < N {
91 vec.push(element);
92 } else {
93 return Err(de::Error::custom(format!(
94 "ArrayVec inline capacity {} exceeded while deserializing sequence",
95 N
96 )));
97 }
98 }
99
100 Ok(vec)
101 }
102 }
103
104 deserializer.deserialize_seq(ArrayVecVisitor {
105 _marker: PhantomData,
106 })
107 }
108}
109
110#[cfg(all(feature = "fastvec", feature = "serde"))]
111impl<'de, T: Deserialize<'de>, const N: usize> Deserialize<'de> for FastVec<T, N> {
112 #[inline]
116 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
117 where
118 D: Deserializer<'de>,
119 {
120 struct FastVecVisitor<T, const N: usize> {
121 _marker: PhantomData<T>,
122 }
123
124 impl<'de, T: Deserialize<'de>, const N: usize> Visitor<'de> for FastVecVisitor<T, N> {
125 type Value = FastVec<T, N>;
126
127 fn expecting(&self, formatter: &mut core::fmt::Formatter) -> core::fmt::Result {
128 formatter.write_str("a sequence")
129 }
130
131 fn visit_seq<A>(self, mut seq: A) -> Result<Self::Value, A::Error>
132 where
133 A: SeqAccess<'de>,
134 {
135 let mut vec = match seq.size_hint() {
136 Some(hint) => FastVec::with_capacity(hint),
137 None => FastVec::new(),
138 };
139
140 let vec_mut = vec.data();
141
142 while let Some(element) = seq.next_element::<T>()? {
143 vec_mut.push(element);
144 }
145
146 Ok(vec)
147 }
148 }
149
150 deserializer.deserialize_seq(FastVecVisitor {
151 _marker: PhantomData,
152 })
153 }
154}
155
156#[cfg(all(feature = "smallvec", feature = "serde"))]
157impl<'de, T: Deserialize<'de>, const N: usize> Deserialize<'de> for SmallVec<T, N> {
158 #[inline]
162 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
163 where
164 D: Deserializer<'de>,
165 {
166 struct SmallVecVisitor<T, const N: usize> {
167 _marker: PhantomData<T>,
168 }
169
170 impl<'de, T: Deserialize<'de>, const N: usize> Visitor<'de> for SmallVecVisitor<T, N> {
171 type Value = SmallVec<T, N>;
172
173 fn expecting(&self, formatter: &mut core::fmt::Formatter) -> core::fmt::Result {
174 formatter.write_str("a sequence")
175 }
176
177 fn visit_seq<A>(self, mut seq: A) -> Result<Self::Value, A::Error>
178 where
179 A: SeqAccess<'de>,
180 {
181 let mut vec = match seq.size_hint() {
182 Some(hint) => SmallVec::with_capacity(hint),
183 None => SmallVec::new(),
184 };
185
186 while let Some(element) = seq.next_element::<T>()? {
187 vec.push(element);
188 }
189
190 Ok(vec)
191 }
192 }
193
194 deserializer.deserialize_seq(SmallVecVisitor {
195 _marker: PhantomData,
196 })
197 }
198}