/rust/registry/src/index.crates.io-6f17d22bba15001f/serde_bytes-0.11.17/src/de.rs
Line | Count | Source (jump to first uncovered line) |
1 | | use crate::{ByteArray, Bytes}; |
2 | | use core::fmt; |
3 | | use core::marker::PhantomData; |
4 | | use serde::de::{Error, Visitor}; |
5 | | use serde::Deserializer; |
6 | | |
7 | | #[cfg(any(feature = "std", feature = "alloc"))] |
8 | | use crate::ByteBuf; |
9 | | |
10 | | #[cfg(any(feature = "std", feature = "alloc"))] |
11 | | use core::cmp; |
12 | | |
13 | | #[cfg(feature = "alloc")] |
14 | | use alloc::borrow::Cow; |
15 | | #[cfg(all(feature = "std", not(feature = "alloc")))] |
16 | | use std::borrow::Cow; |
17 | | |
18 | | #[cfg(feature = "alloc")] |
19 | | use alloc::boxed::Box; |
20 | | #[cfg(feature = "alloc")] |
21 | | use alloc::string::String; |
22 | | #[cfg(feature = "alloc")] |
23 | | use alloc::vec::Vec; |
24 | | |
25 | | #[cfg(any(feature = "std", feature = "alloc"))] |
26 | | use serde::de::SeqAccess; |
27 | | |
28 | | /// Types that can be deserialized via `#[serde(with = "serde_bytes")]`. |
29 | | pub trait Deserialize<'de>: Sized { |
30 | | #[allow(missing_docs)] |
31 | | fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> |
32 | | where |
33 | | D: Deserializer<'de>; |
34 | | } |
35 | | |
36 | | impl<'de: 'a, 'a> Deserialize<'de> for &'a [u8] { |
37 | 0 | fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> |
38 | 0 | where |
39 | 0 | D: Deserializer<'de>, |
40 | 0 | { |
41 | 0 | // serde::Deserialize for &[u8] is already optimized, so simply forward to that. |
42 | 0 | serde::Deserialize::deserialize(deserializer) |
43 | 0 | } |
44 | | } |
45 | | |
46 | | #[cfg(any(feature = "std", feature = "alloc"))] |
47 | | impl<'de> Deserialize<'de> for Vec<u8> { |
48 | 0 | fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> |
49 | 0 | where |
50 | 0 | D: Deserializer<'de>, |
51 | 0 | { |
52 | 0 | Deserialize::deserialize(deserializer).map(ByteBuf::into_vec) |
53 | 0 | } |
54 | | } |
55 | | |
56 | | impl<'de: 'a, 'a> Deserialize<'de> for &'a Bytes { |
57 | 0 | fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> |
58 | 0 | where |
59 | 0 | D: Deserializer<'de>, |
60 | 0 | { |
61 | 0 | // serde::Deserialize for &[u8] is already optimized, so simply forward to that. |
62 | 0 | serde::Deserialize::deserialize(deserializer).map(Bytes::new) |
63 | 0 | } |
64 | | } |
65 | | |
66 | | impl<'de, const N: usize> Deserialize<'de> for [u8; N] { |
67 | 0 | fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> |
68 | 0 | where |
69 | 0 | D: Deserializer<'de>, |
70 | 0 | { |
71 | 0 | let arr: ByteArray<N> = serde::Deserialize::deserialize(deserializer)?; |
72 | 0 | Ok(*arr) |
73 | 0 | } |
74 | | } |
75 | | |
76 | | impl<'de, const N: usize> Deserialize<'de> for &'de [u8; N] { |
77 | 0 | fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> |
78 | 0 | where |
79 | 0 | D: Deserializer<'de>, |
80 | 0 | { |
81 | 0 | let arr: &ByteArray<N> = serde::Deserialize::deserialize(deserializer)?; |
82 | 0 | Ok(arr) |
83 | 0 | } |
84 | | } |
85 | | |
86 | | impl<'de, const N: usize> Deserialize<'de> for ByteArray<N> { |
87 | 0 | fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> |
88 | 0 | where |
89 | 0 | D: Deserializer<'de>, |
90 | 0 | { |
91 | 0 | // Via the serde::Deserialize impl for ByteArray. |
92 | 0 | serde::Deserialize::deserialize(deserializer) |
93 | 0 | } |
94 | | } |
95 | | |
96 | | impl<'de: 'a, 'a, const N: usize> Deserialize<'de> for &'a ByteArray<N> { |
97 | 0 | fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> |
98 | 0 | where |
99 | 0 | D: Deserializer<'de>, |
100 | 0 | { |
101 | 0 | // Via the serde::Deserialize impl for &ByteArray. |
102 | 0 | serde::Deserialize::deserialize(deserializer) |
103 | 0 | } |
104 | | } |
105 | | |
106 | | #[cfg(any(feature = "std", feature = "alloc"))] |
107 | | impl<'de> Deserialize<'de> for ByteBuf { |
108 | 0 | fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> |
109 | 0 | where |
110 | 0 | D: Deserializer<'de>, |
111 | 0 | { |
112 | 0 | // Via the serde::Deserialize impl for ByteBuf. |
113 | 0 | serde::Deserialize::deserialize(deserializer) |
114 | 0 | } |
115 | | } |
116 | | |
117 | | #[cfg(any(feature = "std", feature = "alloc"))] |
118 | | impl<'de: 'a, 'a> Deserialize<'de> for Cow<'a, [u8]> { |
119 | 0 | fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> |
120 | 0 | where |
121 | 0 | D: Deserializer<'de>, |
122 | 0 | { |
123 | | struct CowVisitor; |
124 | | |
125 | | impl<'de> Visitor<'de> for CowVisitor { |
126 | | type Value = Cow<'de, [u8]>; |
127 | | |
128 | 0 | fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { |
129 | 0 | formatter.write_str("a byte array") |
130 | 0 | } |
131 | | |
132 | 0 | fn visit_borrowed_bytes<E>(self, v: &'de [u8]) -> Result<Self::Value, E> |
133 | 0 | where |
134 | 0 | E: Error, |
135 | 0 | { |
136 | 0 | Ok(Cow::Borrowed(v)) |
137 | 0 | } |
138 | | |
139 | 0 | fn visit_borrowed_str<E>(self, v: &'de str) -> Result<Self::Value, E> |
140 | 0 | where |
141 | 0 | E: Error, |
142 | 0 | { |
143 | 0 | Ok(Cow::Borrowed(v.as_bytes())) |
144 | 0 | } |
145 | | |
146 | 0 | fn visit_bytes<E>(self, v: &[u8]) -> Result<Self::Value, E> |
147 | 0 | where |
148 | 0 | E: Error, |
149 | 0 | { |
150 | 0 | Ok(Cow::Owned(v.to_vec())) |
151 | 0 | } |
152 | | |
153 | 0 | fn visit_str<E>(self, v: &str) -> Result<Self::Value, E> |
154 | 0 | where |
155 | 0 | E: Error, |
156 | 0 | { |
157 | 0 | Ok(Cow::Owned(v.as_bytes().to_vec())) |
158 | 0 | } |
159 | | |
160 | 0 | fn visit_byte_buf<E>(self, v: Vec<u8>) -> Result<Self::Value, E> |
161 | 0 | where |
162 | 0 | E: Error, |
163 | 0 | { |
164 | 0 | Ok(Cow::Owned(v)) |
165 | 0 | } |
166 | | |
167 | 0 | fn visit_string<E>(self, v: String) -> Result<Self::Value, E> |
168 | 0 | where |
169 | 0 | E: Error, |
170 | 0 | { |
171 | 0 | Ok(Cow::Owned(v.into_bytes())) |
172 | 0 | } |
173 | | |
174 | 0 | fn visit_seq<V>(self, mut visitor: V) -> Result<Self::Value, V::Error> |
175 | 0 | where |
176 | 0 | V: SeqAccess<'de>, |
177 | 0 | { |
178 | 0 | let len = cmp::min(visitor.size_hint().unwrap_or(0), 4096); |
179 | 0 | let mut bytes = Vec::with_capacity(len); |
180 | | |
181 | 0 | while let Some(b) = visitor.next_element()? { |
182 | 0 | bytes.push(b); |
183 | 0 | } |
184 | | |
185 | 0 | Ok(Cow::Owned(bytes)) |
186 | 0 | } |
187 | | } |
188 | | |
189 | 0 | deserializer.deserialize_bytes(CowVisitor) |
190 | 0 | } |
191 | | } |
192 | | |
193 | | #[cfg(any(feature = "std", feature = "alloc"))] |
194 | | impl<'de: 'a, 'a> Deserialize<'de> for Cow<'a, Bytes> { |
195 | 0 | fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> |
196 | 0 | where |
197 | 0 | D: Deserializer<'de>, |
198 | 0 | { |
199 | 0 | let cow: Cow<[u8]> = Deserialize::deserialize(deserializer)?; |
200 | 0 | match cow { |
201 | 0 | Cow::Borrowed(bytes) => Ok(Cow::Borrowed(Bytes::new(bytes))), |
202 | 0 | Cow::Owned(bytes) => Ok(Cow::Owned(ByteBuf::from(bytes))), |
203 | | } |
204 | 0 | } |
205 | | } |
206 | | |
207 | | #[cfg(any(feature = "std", feature = "alloc"))] |
208 | | impl<'de> Deserialize<'de> for Box<[u8]> { |
209 | 0 | fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> |
210 | 0 | where |
211 | 0 | D: Deserializer<'de>, |
212 | 0 | { |
213 | 0 | Deserialize::deserialize(deserializer).map(Vec::into_boxed_slice) |
214 | 0 | } |
215 | | } |
216 | | |
217 | | #[cfg(any(feature = "std", feature = "alloc"))] |
218 | | impl<'de> Deserialize<'de> for Box<Bytes> { |
219 | 0 | fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> |
220 | 0 | where |
221 | 0 | D: Deserializer<'de>, |
222 | 0 | { |
223 | 0 | let bytes: Box<[u8]> = Deserialize::deserialize(deserializer)?; |
224 | 0 | Ok(bytes.into()) |
225 | 0 | } |
226 | | } |
227 | | |
228 | | impl<'de, T> Deserialize<'de> for Option<T> |
229 | | where |
230 | | T: Deserialize<'de>, |
231 | | { |
232 | 0 | fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> |
233 | 0 | where |
234 | 0 | D: Deserializer<'de>, |
235 | 0 | { |
236 | | struct BytesVisitor<T> { |
237 | | out: PhantomData<T>, |
238 | | } |
239 | | |
240 | | impl<'de, T> Visitor<'de> for BytesVisitor<T> |
241 | | where |
242 | | T: Deserialize<'de>, |
243 | | { |
244 | | type Value = Option<T>; |
245 | | |
246 | 0 | fn expecting(&self, f: &mut fmt::Formatter) -> fmt::Result { |
247 | 0 | f.write_str("optional byte array") |
248 | 0 | } |
249 | | |
250 | 0 | fn visit_unit<E: Error>(self) -> Result<Self::Value, E> { |
251 | 0 | Ok(None) |
252 | 0 | } |
253 | | |
254 | 0 | fn visit_none<E: Error>(self) -> Result<Self::Value, E> { |
255 | 0 | Ok(None) |
256 | 0 | } |
257 | | |
258 | 0 | fn visit_some<D>(self, deserializer: D) -> Result<Self::Value, D::Error> |
259 | 0 | where |
260 | 0 | D: Deserializer<'de>, |
261 | 0 | { |
262 | 0 | T::deserialize(deserializer).map(Some) |
263 | 0 | } |
264 | | } |
265 | | |
266 | 0 | let visitor = BytesVisitor { out: PhantomData }; |
267 | 0 | deserializer.deserialize_option(visitor) |
268 | 0 | } |
269 | | } |