1#![allow(deprecated)]
2use crate::config::Config;
3use crate::de::BorrowDecode;
4use crate::de::BorrowDecoder;
5use crate::de::Decode;
6use crate::de::DecoderImpl;
7use crate::de::read::SliceReader;
8use crate::error::DecodeError;
9use core::marker::PhantomData;
10use serde::de::Deserialize;
11use serde::de::DeserializeSeed;
12use serde::de::Deserializer;
13use serde::de::EnumAccess;
14use serde::de::IntoDeserializer;
15use serde::de::MapAccess;
16use serde::de::SeqAccess;
17use serde::de::VariantAccess;
18use serde::de::Visitor;
19
20pub struct BorrowedSerdeDecoder<'de, DE: BorrowDecoder<'de>> {
22 pub(super) de: DE,
23 pub(super) pd: PhantomData<&'de ()>,
24}
25
26impl<'de, DE: BorrowDecoder<'de>> BorrowedSerdeDecoder<'de, DE> {
27 pub fn as_deserializer<'a>(
29 &'a mut self
30 ) -> impl serde::Deserializer<'de, Error = DecodeError> + 'a {
31 SerdeDecoder {
32 de: &mut self.de,
33 pd: PhantomData,
34 }
35 }
36}
37
38impl<'de, C: Config, Context> BorrowedSerdeDecoder<'de, DecoderImpl<SliceReader<'de>, C, Context>> {
39 pub const fn from_slice(
41 slice: &'de [u8],
42 config: C,
43 context: Context,
44 ) -> Self
45 where
46 C: Config,
47 {
48 let reader = SliceReader::new(slice);
49 let decoder = DecoderImpl::new(reader, config, context);
50 Self {
51 de: decoder,
52 pd: PhantomData,
53 }
54 }
55}
56
57pub fn borrow_decode_from_slice<'de, D, C>(
64 slice: &'de [u8],
65 config: C,
66) -> Result<(D, usize), DecodeError>
67where
68 D: Deserialize<'de>,
69 C: Config,
70{
71 let mut serde_decoder =
72 BorrowedSerdeDecoder::<DecoderImpl<SliceReader<'de>, C, ()>>::from_slice(slice, config, ());
73 let result = D::deserialize(serde_decoder.as_deserializer())?;
74 let bytes_read = slice.len() - serde_decoder.de.borrow_reader().slice.len();
75 Ok((result, bytes_read))
76}
77
78pub fn seed_decode_from_slice<'de, D, C>(
83 seed: D,
84 slice: &'de [u8],
85 config: C,
86) -> Result<(D::Value, usize), DecodeError>
87where
88 D: DeserializeSeed<'de>,
89 C: Config,
90{
91 let mut serde_decoder =
92 BorrowedSerdeDecoder::<DecoderImpl<SliceReader<'de>, C, ()>>::from_slice(slice, config, ());
93 let result = seed.deserialize(serde_decoder.as_deserializer())?;
94 let bytes_read = slice.len() - serde_decoder.de.borrow_reader().slice.len();
95 Ok((result, bytes_read))
96}
97
98pub(super) struct SerdeDecoder<'a, 'de, DE: BorrowDecoder<'de>> {
99 pub(super) de: &'a mut DE,
100 pub(super) pd: PhantomData<&'de ()>,
101}
102
103impl<'de, DE: BorrowDecoder<'de>> Deserializer<'de> for SerdeDecoder<'_, 'de, DE> {
104 type Error = DecodeError;
105
106 serde::serde_if_integer128! {
107 fn deserialize_i128<V>(mut self, visitor: V) -> Result<V::Value, Self::Error>
108 where
109 V: serde::de::Visitor<'de>,
110 {
111 visitor.visit_i128(Decode::decode(&mut self.de)?)
112 }
113 }
114
115 serde::serde_if_integer128! {
116 fn deserialize_u128<V>(mut self, visitor: V) -> Result<V::Value, Self::Error>
117 where
118 V: serde::de::Visitor<'de>,
119 {
120 visitor.visit_u128(Decode::decode(&mut self.de)?)
121 }
122 }
123
124 fn deserialize_any<V>(
125 self,
126 _: V,
127 ) -> Result<V::Value, Self::Error>
128 where
129 V: serde::de::Visitor<'de>,
130 {
131 super::cold_decode_error_any_not_supported::<'de, V>().map_err(core::convert::Into::into)
132 }
133
134 fn deserialize_bool<V>(
135 mut self,
136 visitor: V,
137 ) -> Result<V::Value, Self::Error>
138 where
139 V: serde::de::Visitor<'de>,
140 {
141 visitor.visit_bool(Decode::decode(&mut self.de)?)
142 }
143
144 fn deserialize_i8<V>(
145 mut self,
146 visitor: V,
147 ) -> Result<V::Value, Self::Error>
148 where
149 V: serde::de::Visitor<'de>,
150 {
151 visitor.visit_i8(Decode::decode(&mut self.de)?)
152 }
153
154 fn deserialize_i16<V>(
155 mut self,
156 visitor: V,
157 ) -> Result<V::Value, Self::Error>
158 where
159 V: serde::de::Visitor<'de>,
160 {
161 visitor.visit_i16(Decode::decode(&mut self.de)?)
162 }
163
164 fn deserialize_i32<V>(
165 mut self,
166 visitor: V,
167 ) -> Result<V::Value, Self::Error>
168 where
169 V: serde::de::Visitor<'de>,
170 {
171 visitor.visit_i32(Decode::decode(&mut self.de)?)
172 }
173
174 fn deserialize_i64<V>(
175 mut self,
176 visitor: V,
177 ) -> Result<V::Value, Self::Error>
178 where
179 V: serde::de::Visitor<'de>,
180 {
181 visitor.visit_i64(Decode::decode(&mut self.de)?)
182 }
183
184 fn deserialize_u8<V>(
185 mut self,
186 visitor: V,
187 ) -> Result<V::Value, Self::Error>
188 where
189 V: serde::de::Visitor<'de>,
190 {
191 visitor.visit_u8(Decode::decode(&mut self.de)?)
192 }
193
194 fn deserialize_u16<V>(
195 mut self,
196 visitor: V,
197 ) -> Result<V::Value, Self::Error>
198 where
199 V: serde::de::Visitor<'de>,
200 {
201 visitor.visit_u16(Decode::decode(&mut self.de)?)
202 }
203
204 fn deserialize_u32<V>(
205 mut self,
206 visitor: V,
207 ) -> Result<V::Value, Self::Error>
208 where
209 V: serde::de::Visitor<'de>,
210 {
211 visitor.visit_u32(Decode::decode(&mut self.de)?)
212 }
213
214 fn deserialize_u64<V>(
215 mut self,
216 visitor: V,
217 ) -> Result<V::Value, Self::Error>
218 where
219 V: serde::de::Visitor<'de>,
220 {
221 visitor.visit_u64(Decode::decode(&mut self.de)?)
222 }
223
224 fn deserialize_f32<V>(
225 mut self,
226 visitor: V,
227 ) -> Result<V::Value, Self::Error>
228 where
229 V: serde::de::Visitor<'de>,
230 {
231 visitor.visit_f32(Decode::decode(&mut self.de)?)
232 }
233
234 fn deserialize_f64<V>(
235 mut self,
236 visitor: V,
237 ) -> Result<V::Value, Self::Error>
238 where
239 V: serde::de::Visitor<'de>,
240 {
241 visitor.visit_f64(Decode::decode(&mut self.de)?)
242 }
243
244 fn deserialize_char<V>(
245 mut self,
246 visitor: V,
247 ) -> Result<V::Value, Self::Error>
248 where
249 V: serde::de::Visitor<'de>,
250 {
251 visitor.visit_char(Decode::decode(&mut self.de)?)
252 }
253
254 fn deserialize_str<V>(
255 mut self,
256 visitor: V,
257 ) -> Result<V::Value, Self::Error>
258 where
259 V: serde::de::Visitor<'de>,
260 {
261 let str = <&'de str>::borrow_decode(&mut self.de)?;
262 visitor.visit_borrowed_str(str)
263 }
264
265 #[cfg(not(feature = "alloc"))]
266 fn deserialize_string<V>(
267 self,
268 _: V,
269 ) -> Result<V::Value, Self::Error>
270 where
271 V: serde::de::Visitor<'de>,
272 {
273 return super::cold_decode_error_cannot_borrow_owned_data::<'de, V>().map_err(|e| e.into());
274 }
275
276 #[cfg(feature = "alloc")]
277 fn deserialize_string<V>(
278 mut self,
279 visitor: V,
280 ) -> Result<V::Value, Self::Error>
281 where
282 V: serde::de::Visitor<'de>,
283 {
284 visitor.visit_string(Decode::decode(&mut self.de)?)
285 }
286
287 fn deserialize_bytes<V>(
288 mut self,
289 visitor: V,
290 ) -> Result<V::Value, Self::Error>
291 where
292 V: serde::de::Visitor<'de>,
293 {
294 let bytes = <&'de [u8]>::borrow_decode(&mut self.de)?;
295 visitor.visit_borrowed_bytes(bytes)
296 }
297
298 #[cfg(not(feature = "alloc"))]
299 fn deserialize_byte_buf<V>(
300 self,
301 _: V,
302 ) -> Result<V::Value, Self::Error>
303 where
304 V: serde::de::Visitor<'de>,
305 {
306 return super::cold_decode_error_cannot_borrow_owned_data::<'de, V>().map_err(|e| e.into());
307 }
308
309 #[cfg(feature = "alloc")]
310 fn deserialize_byte_buf<V>(
311 mut self,
312 visitor: V,
313 ) -> Result<V::Value, Self::Error>
314 where
315 V: serde::de::Visitor<'de>,
316 {
317 visitor.visit_byte_buf(Decode::decode(&mut self.de)?)
318 }
319
320 fn deserialize_option<V>(
321 mut self,
322 visitor: V,
323 ) -> Result<V::Value, Self::Error>
324 where
325 V: serde::de::Visitor<'de>,
326 {
327 let variant = crate::de::decode_option_variant(&mut self.de, "Option<T>")?;
328 if variant.is_some() {
329 visitor.visit_some(self)
330 } else {
331 visitor.visit_none()
332 }
333 }
334
335 fn deserialize_unit<V>(
336 self,
337 visitor: V,
338 ) -> Result<V::Value, Self::Error>
339 where
340 V: serde::de::Visitor<'de>,
341 {
342 visitor.visit_unit()
343 }
344
345 fn deserialize_unit_struct<V>(
346 self,
347 _name: &'static str,
348 visitor: V,
349 ) -> Result<V::Value, Self::Error>
350 where
351 V: serde::de::Visitor<'de>,
352 {
353 visitor.visit_unit()
354 }
355
356 fn deserialize_newtype_struct<V>(
357 self,
358 _name: &'static str,
359 visitor: V,
360 ) -> Result<V::Value, Self::Error>
361 where
362 V: serde::de::Visitor<'de>,
363 {
364 visitor.visit_newtype_struct(self)
365 }
366
367 fn deserialize_seq<V>(
368 mut self,
369 visitor: V,
370 ) -> Result<V::Value, Self::Error>
371 where
372 V: serde::de::Visitor<'de>,
373 {
374 let len = usize::decode(&mut self.de)?;
375 self.deserialize_tuple(len, visitor)
376 }
377
378 fn deserialize_tuple<V>(
379 mut self,
380 len: usize,
381 visitor: V,
382 ) -> Result<V::Value, Self::Error>
383 where
384 V: serde::de::Visitor<'de>,
385 {
386 struct Access<'a, 'b, 'de, DE: BorrowDecoder<'de>> {
387 deserializer: &'a mut SerdeDecoder<'b, 'de, DE>,
388 len: usize,
389 }
390
391 impl<'de, 'a, 'b: 'a, DE: BorrowDecoder<'de> + 'b> SeqAccess<'de> for Access<'a, 'b, 'de, DE> {
392 type Error = DecodeError;
393
394 fn next_element_seed<T>(
395 &mut self,
396 seed: T,
397 ) -> Result<Option<T::Value>, DecodeError>
398 where
399 T: DeserializeSeed<'de>,
400 {
401 if self.len > 0 {
402 self.len -= 1;
403 let value = match DeserializeSeed::deserialize(
404 seed,
405 SerdeDecoder {
406 de: self.deserializer.de,
407 pd: PhantomData,
408 },
409 ) {
410 | Ok(v) => v,
411 | Err(DecodeError::UnexpectedEnd { .. }) => return Ok(None),
412 | Err(e) => return Err(e),
413 };
414 Ok(Some(value))
415 } else {
416 Ok(None)
417 }
418 }
419
420 fn size_hint(&self) -> Option<usize> {
421 Some(self.len)
422 }
423 }
424
425 visitor.visit_seq(Access {
426 deserializer: &mut self,
427 len,
428 })
429 }
430
431 fn deserialize_tuple_struct<V>(
432 self,
433 _name: &'static str,
434 len: usize,
435 visitor: V,
436 ) -> Result<V::Value, Self::Error>
437 where
438 V: serde::de::Visitor<'de>,
439 {
440 self.deserialize_tuple(len, visitor)
441 }
442
443 fn deserialize_map<V>(
444 mut self,
445 visitor: V,
446 ) -> Result<V::Value, Self::Error>
447 where
448 V: serde::de::Visitor<'de>,
449 {
450 struct Access<'a, 'b, 'de, DE: BorrowDecoder<'de>> {
451 deserializer: &'a mut SerdeDecoder<'b, 'de, DE>,
452 len: usize,
453 }
454
455 impl<'de, 'a, 'b: 'a, DE: BorrowDecoder<'de> + 'b> MapAccess<'de> for Access<'a, 'b, 'de, DE> {
456 type Error = DecodeError;
457
458 fn next_key_seed<K>(
459 &mut self,
460 seed: K,
461 ) -> Result<Option<K::Value>, DecodeError>
462 where
463 K: DeserializeSeed<'de>,
464 {
465 if self.len > 0 {
466 self.len -= 1;
467 let key = DeserializeSeed::deserialize(
468 seed,
469 SerdeDecoder {
470 de: self.deserializer.de,
471 pd: PhantomData,
472 },
473 )?;
474 Ok(Some(key))
475 } else {
476 Ok(None)
477 }
478 }
479
480 fn next_value_seed<V>(
481 &mut self,
482 seed: V,
483 ) -> Result<V::Value, DecodeError>
484 where
485 V: DeserializeSeed<'de>,
486 {
487 let value = DeserializeSeed::deserialize(
488 seed,
489 SerdeDecoder {
490 de: self.deserializer.de,
491 pd: PhantomData,
492 },
493 )?;
494 Ok(value)
495 }
496
497 fn size_hint(&self) -> Option<usize> {
498 Some(self.len)
499 }
500 }
501
502 let len = usize::decode(&mut self.de)?;
503
504 visitor.visit_map(Access {
505 deserializer: &mut self,
506 len,
507 })
508 }
509
510 fn deserialize_struct<V>(
511 self,
512 _name: &'static str,
513 fields: &'static [&'static str],
514 visitor: V,
515 ) -> Result<V::Value, Self::Error>
516 where
517 V: serde::de::Visitor<'de>,
518 {
519 self.deserialize_tuple(fields.len(), visitor)
520 }
521
522 fn deserialize_enum<V>(
523 self,
524 _name: &'static str,
525 _variants: &'static [&'static str],
526 visitor: V,
527 ) -> Result<V::Value, Self::Error>
528 where
529 V: serde::de::Visitor<'de>,
530 {
531 visitor.visit_enum(self)
532 }
533
534 fn deserialize_identifier<V>(
535 self,
536 _visitor: V,
537 ) -> Result<V::Value, Self::Error>
538 where
539 V: serde::de::Visitor<'de>,
540 {
541 super::cold_decode_error_identifier_not_supported::<'de, V>()
542 .map_err(core::convert::Into::into)
543 }
544
545 fn deserialize_ignored_any<V>(
546 self,
547 _: V,
548 ) -> Result<V::Value, Self::Error>
549 where
550 V: serde::de::Visitor<'de>,
551 {
552 super::cold_decode_error_ignored_any_not_supported::<'de, V>()
553 .map_err(core::convert::Into::into)
554 }
555
556 fn is_human_readable(&self) -> bool {
557 false
558 }
559}
560
561impl<'de, DE: BorrowDecoder<'de>> EnumAccess<'de> for SerdeDecoder<'_, 'de, DE> {
562 type Error = DecodeError;
563 type Variant = Self;
564
565 fn variant_seed<V>(
566 mut self,
567 seed: V,
568 ) -> Result<(V::Value, Self::Variant), Self::Error>
569 where
570 V: DeserializeSeed<'de>,
571 {
572 let idx = u32::decode(&mut self.de)?;
573 let de: serde::de::value::U32Deserializer<crate::error::DecodeError> =
574 idx.into_deserializer();
575 let val = seed.deserialize(de)?;
576 Ok((val, self))
577 }
578}
579
580impl<'de, DE: BorrowDecoder<'de>> VariantAccess<'de> for SerdeDecoder<'_, 'de, DE> {
581 type Error = DecodeError;
582
583 fn unit_variant(self) -> Result<(), Self::Error> {
584 Ok(())
585 }
586
587 fn newtype_variant_seed<T>(
588 self,
589 seed: T,
590 ) -> Result<T::Value, Self::Error>
591 where
592 T: DeserializeSeed<'de>,
593 {
594 DeserializeSeed::deserialize(seed, self)
595 }
596
597 fn tuple_variant<V>(
598 self,
599 len: usize,
600 visitor: V,
601 ) -> Result<V::Value, Self::Error>
602 where
603 V: Visitor<'de>,
604 {
605 Deserializer::deserialize_tuple(self, len, visitor)
606 }
607
608 fn struct_variant<V>(
609 self,
610 fields: &'static [&'static str],
611 visitor: V,
612 ) -> Result<V::Value, Self::Error>
613 where
614 V: Visitor<'de>,
615 {
616 Deserializer::deserialize_tuple(self, fields.len(), visitor)
617 }
618}