serde_bytes_repr/
deserializer.rs

1use crate::{ByteFmtDeserializer, ByteFormat};
2use base64::Engine;
3use serde::de;
4use std::fmt;
5
6impl<'de, D> de::Deserializer<'de> for ByteFmtDeserializer<D>
7where
8    D: de::Deserializer<'de>,
9{
10    type Error = D::Error;
11
12    fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, D::Error>
13    where
14        V: de::Visitor<'de>,
15    {
16        self.inner.deserialize_any(Visitor::new(visitor, self.fmt))
17    }
18
19    fn deserialize_bool<V>(self, visitor: V) -> Result<V::Value, D::Error>
20    where
21        V: de::Visitor<'de>,
22    {
23        self.inner.deserialize_bool(Visitor::new(visitor, self.fmt))
24    }
25
26    fn deserialize_u8<V>(self, visitor: V) -> Result<V::Value, D::Error>
27    where
28        V: de::Visitor<'de>,
29    {
30        self.inner.deserialize_u8(Visitor::new(visitor, self.fmt))
31    }
32
33    fn deserialize_u16<V>(self, visitor: V) -> Result<V::Value, D::Error>
34    where
35        V: de::Visitor<'de>,
36    {
37        self.inner.deserialize_u16(Visitor::new(visitor, self.fmt))
38    }
39
40    fn deserialize_u32<V>(self, visitor: V) -> Result<V::Value, D::Error>
41    where
42        V: de::Visitor<'de>,
43    {
44        self.inner.deserialize_u32(Visitor::new(visitor, self.fmt))
45    }
46
47    fn deserialize_u64<V>(self, visitor: V) -> Result<V::Value, D::Error>
48    where
49        V: de::Visitor<'de>,
50    {
51        self.inner.deserialize_u64(Visitor::new(visitor, self.fmt))
52    }
53
54    fn deserialize_u128<V>(self, visitor: V) -> Result<V::Value, D::Error>
55    where
56        V: de::Visitor<'de>,
57    {
58        self.inner.deserialize_u128(Visitor::new(visitor, self.fmt))
59    }
60
61    fn deserialize_i8<V>(self, visitor: V) -> Result<V::Value, D::Error>
62    where
63        V: de::Visitor<'de>,
64    {
65        self.inner.deserialize_i8(Visitor::new(visitor, self.fmt))
66    }
67
68    fn deserialize_i16<V>(self, visitor: V) -> Result<V::Value, D::Error>
69    where
70        V: de::Visitor<'de>,
71    {
72        self.inner.deserialize_i16(Visitor::new(visitor, self.fmt))
73    }
74
75    fn deserialize_i32<V>(self, visitor: V) -> Result<V::Value, D::Error>
76    where
77        V: de::Visitor<'de>,
78    {
79        self.inner.deserialize_i32(Visitor::new(visitor, self.fmt))
80    }
81
82    fn deserialize_i64<V>(self, visitor: V) -> Result<V::Value, D::Error>
83    where
84        V: de::Visitor<'de>,
85    {
86        self.inner.deserialize_i64(Visitor::new(visitor, self.fmt))
87    }
88
89    fn deserialize_i128<V>(self, visitor: V) -> Result<V::Value, D::Error>
90    where
91        V: de::Visitor<'de>,
92    {
93        self.inner.deserialize_i128(Visitor::new(visitor, self.fmt))
94    }
95
96    fn deserialize_f32<V>(self, visitor: V) -> Result<V::Value, D::Error>
97    where
98        V: de::Visitor<'de>,
99    {
100        self.inner.deserialize_f32(Visitor::new(visitor, self.fmt))
101    }
102
103    fn deserialize_f64<V>(self, visitor: V) -> Result<V::Value, D::Error>
104    where
105        V: de::Visitor<'de>,
106    {
107        self.inner.deserialize_f64(Visitor::new(visitor, self.fmt))
108    }
109
110    fn deserialize_char<V>(self, visitor: V) -> Result<V::Value, D::Error>
111    where
112        V: de::Visitor<'de>,
113    {
114        self.inner.deserialize_char(Visitor::new(visitor, self.fmt))
115    }
116
117    fn deserialize_str<V>(self, visitor: V) -> Result<V::Value, D::Error>
118    where
119        V: de::Visitor<'de>,
120    {
121        self.inner.deserialize_str(Visitor::new(visitor, self.fmt))
122    }
123
124    fn deserialize_string<V>(self, visitor: V) -> Result<V::Value, D::Error>
125    where
126        V: de::Visitor<'de>,
127    {
128        self.inner
129            .deserialize_string(Visitor::new(visitor, self.fmt))
130    }
131
132    fn deserialize_bytes<V>(self, visitor: V) -> Result<V::Value, D::Error>
133    where
134        V: de::Visitor<'de>,
135    {
136        self.inner
137            .deserialize_bytes(Visitor::new(visitor, self.fmt))
138    }
139
140    fn deserialize_byte_buf<V>(self, visitor: V) -> Result<V::Value, D::Error>
141    where
142        V: de::Visitor<'de>,
143    {
144        self.inner
145            .deserialize_byte_buf(Visitor::new(visitor, self.fmt))
146    }
147
148    fn deserialize_option<V>(self, visitor: V) -> Result<V::Value, D::Error>
149    where
150        V: de::Visitor<'de>,
151    {
152        self.inner
153            .deserialize_option(Visitor::new(visitor, self.fmt))
154    }
155
156    fn deserialize_unit<V>(self, visitor: V) -> Result<V::Value, D::Error>
157    where
158        V: de::Visitor<'de>,
159    {
160        self.inner.deserialize_unit(Visitor::new(visitor, self.fmt))
161    }
162
163    fn deserialize_unit_struct<V>(
164        self,
165        name: &'static str,
166        visitor: V,
167    ) -> Result<V::Value, D::Error>
168    where
169        V: de::Visitor<'de>,
170    {
171        self.inner
172            .deserialize_unit_struct(name, Visitor::new(visitor, self.fmt))
173    }
174
175    fn deserialize_newtype_struct<V>(
176        self,
177        name: &'static str,
178        visitor: V,
179    ) -> Result<V::Value, D::Error>
180    where
181        V: de::Visitor<'de>,
182    {
183        self.inner
184            .deserialize_newtype_struct(name, Visitor::new(visitor, self.fmt))
185    }
186
187    fn deserialize_seq<V>(self, visitor: V) -> Result<V::Value, D::Error>
188    where
189        V: de::Visitor<'de>,
190    {
191        self.inner.deserialize_seq(Visitor::new(visitor, self.fmt))
192    }
193
194    fn deserialize_tuple<V>(self, len: usize, visitor: V) -> Result<V::Value, D::Error>
195    where
196        V: de::Visitor<'de>,
197    {
198        self.inner
199            .deserialize_tuple(len, Visitor::new(visitor, self.fmt))
200    }
201
202    fn deserialize_tuple_struct<V>(
203        self,
204        name: &'static str,
205        len: usize,
206        visitor: V,
207    ) -> Result<V::Value, D::Error>
208    where
209        V: de::Visitor<'de>,
210    {
211        self.inner
212            .deserialize_tuple_struct(name, len, Visitor::new(visitor, self.fmt))
213    }
214
215    fn deserialize_map<V>(self, visitor: V) -> Result<V::Value, D::Error>
216    where
217        V: de::Visitor<'de>,
218    {
219        self.inner.deserialize_map(Visitor::new(visitor, self.fmt))
220    }
221
222    fn deserialize_struct<V>(
223        self,
224        name: &'static str,
225        fields: &'static [&'static str],
226        visitor: V,
227    ) -> Result<V::Value, D::Error>
228    where
229        V: de::Visitor<'de>,
230    {
231        self.inner
232            .deserialize_struct(name, fields, Visitor::new(visitor, self.fmt))
233    }
234
235    fn deserialize_enum<V>(
236        self,
237        name: &'static str,
238        variants: &'static [&'static str],
239        visitor: V,
240    ) -> Result<V::Value, D::Error>
241    where
242        V: de::Visitor<'de>,
243    {
244        self.inner
245            .deserialize_enum(name, variants, Visitor::new(visitor, self.fmt))
246    }
247
248    fn deserialize_ignored_any<V>(self, visitor: V) -> Result<V::Value, D::Error>
249    where
250        V: de::Visitor<'de>,
251    {
252        self.inner
253            .deserialize_ignored_any(Visitor::new(visitor, self.fmt))
254    }
255
256    fn deserialize_identifier<V>(self, visitor: V) -> Result<V::Value, D::Error>
257    where
258        V: de::Visitor<'de>,
259    {
260        self.inner
261            .deserialize_identifier(Visitor::new(visitor, self.fmt))
262    }
263
264    fn is_human_readable(&self) -> bool {
265        self.inner.is_human_readable()
266    }
267}
268
269struct Visitor<V> {
270    delegate: V,
271    fmt: ByteFormat,
272}
273
274impl<V> Visitor<V> {
275    fn new(delegate: V, format: ByteFormat) -> Self {
276        Visitor {
277            delegate,
278            fmt: format,
279        }
280    }
281
282    fn decode<E>(&self, v: &[u8]) -> Result<Vec<u8>, E>
283    where
284        E: de::Error,
285    {
286        match self.fmt {
287            ByteFormat::Base64(ref alphabet, config) => {
288                match base64::engine::GeneralPurpose::new(alphabet, config).decode(v) {
289                    Ok(bytes) => Ok(bytes),
290                    Err(base64::DecodeError::InvalidByte(index, b)) => Err(E::invalid_value(
291                        de::Unexpected::Char(b.into()),
292                        &format!("valid base64 character at index {}", index).as_str(),
293                    )),
294                    Err(base64::DecodeError::InvalidLength(_)) => {
295                        Err(E::invalid_length(v.len(), &"valid base64 length"))
296                    }
297                    Err(base64::DecodeError::InvalidLastSymbol(_, b)) => Err(E::invalid_value(
298                        de::Unexpected::Char(b.into()),
299                        &"valid character ending base64 string",
300                    )),
301                    Err(base64::DecodeError::InvalidPadding) => Err(E::invalid_value(
302                        de::Unexpected::Other("invalid padding"),
303                        &"valid padding",
304                    )),
305                }
306            }
307            ByteFormat::Hex => match hex::decode(v) {
308                Ok(bytes) => Ok(bytes),
309                Err(hex::FromHexError::OddLength) => {
310                    Err(E::invalid_length(v.len(), &"even length"))
311                }
312                Err(hex::FromHexError::InvalidHexCharacter { c, index }) => Err(E::invalid_value(
313                    de::Unexpected::Char(c),
314                    &format!("valid hex character at index {}", index).as_str(),
315                )),
316                Err(hex::FromHexError::InvalidStringLength) => Err(E::custom(
317                    "Imposible to reach due to unrestricted return length",
318                )),
319            },
320        }
321    }
322}
323
324impl<'de, V> de::Visitor<'de> for Visitor<V>
325where
326    V: de::Visitor<'de>,
327{
328    type Value = V::Value;
329
330    fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
331        self.delegate.expecting(formatter)
332    }
333
334    fn visit_bool<E>(self, v: bool) -> Result<Self::Value, E>
335    where
336        E: de::Error,
337    {
338        self.delegate.visit_bool(v)
339    }
340
341    fn visit_i8<E>(self, v: i8) -> Result<Self::Value, E>
342    where
343        E: de::Error,
344    {
345        self.delegate.visit_i8(v)
346    }
347
348    fn visit_i16<E>(self, v: i16) -> Result<Self::Value, E>
349    where
350        E: de::Error,
351    {
352        self.delegate.visit_i16(v)
353    }
354
355    fn visit_i32<E>(self, v: i32) -> Result<Self::Value, E>
356    where
357        E: de::Error,
358    {
359        self.delegate.visit_i32(v)
360    }
361
362    fn visit_i64<E>(self, v: i64) -> Result<Self::Value, E>
363    where
364        E: de::Error,
365    {
366        self.delegate.visit_i64(v)
367    }
368
369    fn visit_i128<E>(self, v: i128) -> Result<Self::Value, E>
370    where
371        E: de::Error,
372    {
373        self.delegate.visit_i128(v)
374    }
375
376    fn visit_u8<E>(self, v: u8) -> Result<Self::Value, E>
377    where
378        E: de::Error,
379    {
380        self.delegate.visit_u8(v)
381    }
382
383    fn visit_u16<E>(self, v: u16) -> Result<Self::Value, E>
384    where
385        E: de::Error,
386    {
387        self.delegate.visit_u16(v)
388    }
389
390    fn visit_u32<E>(self, v: u32) -> Result<Self::Value, E>
391    where
392        E: de::Error,
393    {
394        self.delegate.visit_u32(v)
395    }
396
397    fn visit_u64<E>(self, v: u64) -> Result<Self::Value, E>
398    where
399        E: de::Error,
400    {
401        self.delegate.visit_u64(v)
402    }
403
404    fn visit_u128<E>(self, v: u128) -> Result<Self::Value, E>
405    where
406        E: de::Error,
407    {
408        self.delegate.visit_u128(v)
409    }
410
411    fn visit_f32<E>(self, v: f32) -> Result<Self::Value, E>
412    where
413        E: de::Error,
414    {
415        self.delegate.visit_f32(v)
416    }
417
418    fn visit_f64<E>(self, v: f64) -> Result<Self::Value, E>
419    where
420        E: de::Error,
421    {
422        self.delegate.visit_f64(v)
423    }
424
425    fn visit_char<E>(self, v: char) -> Result<Self::Value, E>
426    where
427        E: de::Error,
428    {
429        self.delegate.visit_char(v)
430    }
431
432    fn visit_str<E>(self, v: &str) -> Result<Self::Value, E>
433    where
434        E: de::Error,
435    {
436        self.delegate.visit_str(v)
437    }
438
439    fn visit_borrowed_str<E>(self, v: &'de str) -> Result<Self::Value, E>
440    where
441        E: de::Error,
442    {
443        self.delegate.visit_borrowed_str(v)
444    }
445
446    fn visit_string<E>(self, v: String) -> Result<Self::Value, E>
447    where
448        E: de::Error,
449    {
450        self.delegate.visit_string(v)
451    }
452
453    fn visit_unit<E>(self) -> Result<Self::Value, E>
454    where
455        E: de::Error,
456    {
457        self.delegate.visit_unit()
458    }
459
460    fn visit_none<E>(self) -> Result<Self::Value, E>
461    where
462        E: de::Error,
463    {
464        self.delegate.visit_none()
465    }
466
467    fn visit_some<D>(self, deserializer: D) -> Result<Self::Value, D::Error>
468    where
469        D: de::Deserializer<'de>,
470    {
471        self.delegate.visit_some(ByteFmtDeserializer {
472            inner: deserializer,
473            fmt: self.fmt,
474        })
475    }
476
477    fn visit_newtype_struct<D>(self, deserializer: D) -> Result<Self::Value, D::Error>
478    where
479        D: de::Deserializer<'de>,
480    {
481        self.delegate.visit_newtype_struct(ByteFmtDeserializer {
482            inner: deserializer,
483            fmt: self.fmt,
484        })
485    }
486
487    fn visit_seq<A>(self, visitor: A) -> Result<Self::Value, A::Error>
488    where
489        A: de::SeqAccess<'de>,
490    {
491        self.delegate.visit_seq(SeqAccess::new(visitor, self.fmt))
492    }
493
494    fn visit_map<A>(self, visitor: A) -> Result<Self::Value, A::Error>
495    where
496        A: de::MapAccess<'de>,
497    {
498        self.delegate.visit_map(MapAccess::new(visitor, self.fmt))
499    }
500
501    fn visit_enum<A>(self, visitor: A) -> Result<Self::Value, A::Error>
502    where
503        A: de::EnumAccess<'de>,
504    {
505        self.delegate.visit_enum(EnumAccess::new(visitor, self.fmt))
506    }
507
508    fn visit_bytes<E>(self, v: &[u8]) -> Result<Self::Value, E>
509    where
510        E: de::Error,
511    {
512        let decoded = self.decode(v)?;
513        self.delegate.visit_bytes(&decoded)
514    }
515
516    fn visit_borrowed_bytes<E>(self, v: &'de [u8]) -> Result<Self::Value, E>
517    where
518        E: de::Error,
519    {
520        // TODO: Check if there is any way we can do zero copy deserialization
521        self.visit_bytes(v)
522    }
523
524    fn visit_byte_buf<E>(self, v: Vec<u8>) -> Result<Self::Value, E>
525    where
526        E: de::Error,
527    {
528        let decoded = self.decode(&v)?;
529        self.delegate.visit_byte_buf(decoded)
530    }
531}
532
533struct EnumAccess<D> {
534    delegate: D,
535    fmt: ByteFormat,
536}
537
538impl<D> EnumAccess<D> {
539    fn new(delegate: D, fmt: ByteFormat) -> Self {
540        EnumAccess { delegate, fmt }
541    }
542}
543
544impl<'de, D> de::EnumAccess<'de> for EnumAccess<D>
545where
546    D: de::EnumAccess<'de>,
547{
548    type Error = D::Error;
549    type Variant = VariantAccess<D::Variant>;
550
551    fn variant_seed<V>(self, seed: V) -> Result<(V::Value, Self::Variant), D::Error>
552    where
553        V: de::DeserializeSeed<'de>,
554    {
555        let fmt = self.fmt;
556        self.delegate
557            .variant_seed(DeserializeSeed::new(seed, fmt.clone()))
558            .map(|(v, vis)| (v, VariantAccess::new(vis, fmt)))
559    }
560}
561
562struct VariantAccess<D> {
563    delegate: D,
564    fmt: ByteFormat,
565}
566
567impl<D> VariantAccess<D> {
568    fn new(delegate: D, fmt: ByteFormat) -> Self {
569        VariantAccess { delegate, fmt }
570    }
571}
572
573impl<'de, D> de::VariantAccess<'de> for VariantAccess<D>
574where
575    D: de::VariantAccess<'de>,
576{
577    type Error = D::Error;
578
579    fn unit_variant(self) -> Result<(), D::Error> {
580        self.delegate.unit_variant()
581    }
582
583    fn newtype_variant_seed<T>(self, seed: T) -> Result<T::Value, D::Error>
584    where
585        T: de::DeserializeSeed<'de>,
586    {
587        self.delegate
588            .newtype_variant_seed(DeserializeSeed::new(seed, self.fmt))
589    }
590
591    fn tuple_variant<V>(self, len: usize, visitor: V) -> Result<V::Value, D::Error>
592    where
593        V: de::Visitor<'de>,
594    {
595        self.delegate
596            .tuple_variant(len, Visitor::new(visitor, self.fmt))
597    }
598
599    fn struct_variant<V>(
600        self,
601        fields: &'static [&'static str],
602        visitor: V,
603    ) -> Result<V::Value, D::Error>
604    where
605        V: de::Visitor<'de>,
606    {
607        self.delegate
608            .struct_variant(fields, Visitor::new(visitor, self.fmt))
609    }
610}
611
612struct DeserializeSeed<S> {
613    delegate: S,
614    fmt: ByteFormat,
615}
616
617impl<S> DeserializeSeed<S> {
618    fn new(delegate: S, fmt: ByteFormat) -> Self {
619        DeserializeSeed { delegate, fmt }
620    }
621}
622
623impl<'de, S> de::DeserializeSeed<'de> for DeserializeSeed<S>
624where
625    S: de::DeserializeSeed<'de>,
626{
627    type Value = S::Value;
628
629    fn deserialize<D>(self, deserializer: D) -> Result<Self::Value, D::Error>
630    where
631        D: de::Deserializer<'de>,
632    {
633        self.delegate.deserialize(ByteFmtDeserializer {
634            inner: deserializer,
635            fmt: self.fmt,
636        })
637    }
638}
639
640struct SeqAccess<D> {
641    delegate: D,
642    fmt: ByteFormat,
643}
644
645impl<D> SeqAccess<D> {
646    fn new(delegate: D, fmt: ByteFormat) -> Self {
647        SeqAccess { delegate, fmt }
648    }
649}
650
651impl<'de, D> de::SeqAccess<'de> for SeqAccess<D>
652where
653    D: de::SeqAccess<'de>,
654{
655    type Error = D::Error;
656
657    fn next_element_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>, D::Error>
658    where
659        T: de::DeserializeSeed<'de>,
660    {
661        self.delegate
662            .next_element_seed(DeserializeSeed::new(seed, self.fmt.clone()))
663    }
664
665    fn size_hint(&self) -> Option<usize> {
666        self.delegate.size_hint()
667    }
668}
669
670struct MapAccess<D> {
671    delegate: D,
672    fmt: ByteFormat,
673}
674
675impl<D> MapAccess<D> {
676    fn new(delegate: D, fmt: ByteFormat) -> Self {
677        MapAccess { delegate, fmt }
678    }
679}
680
681impl<'de, D> de::MapAccess<'de> for MapAccess<D>
682where
683    D: de::MapAccess<'de>,
684{
685    type Error = D::Error;
686
687    fn next_key_seed<K>(&mut self, seed: K) -> Result<Option<K::Value>, D::Error>
688    where
689        K: de::DeserializeSeed<'de>,
690    {
691        self.delegate
692            .next_key_seed(DeserializeSeed::new(seed, self.fmt.clone()))
693    }
694
695    fn next_value_seed<V>(&mut self, seed: V) -> Result<V::Value, D::Error>
696    where
697        V: de::DeserializeSeed<'de>,
698    {
699        self.delegate
700            .next_value_seed(DeserializeSeed::new(seed, self.fmt.clone()))
701    }
702
703    fn size_hint(&self) -> Option<usize> {
704        self.delegate.size_hint()
705    }
706}