transmog_bincode/
lib.rs

1#![doc = include_str!("./.crate-docs.md")]
2#![forbid(unsafe_code)]
3#![warn(
4    clippy::cargo,
5    missing_docs,
6    // clippy::missing_docs_in_private_items,
7    clippy::pedantic,
8    future_incompatible,
9    rust_2018_idioms,
10)]
11#![allow(
12    clippy::missing_errors_doc, // TODO clippy::missing_errors_doc
13    clippy::option_if_let_else,
14)]
15
16use std::io::{Read, Write};
17
18pub use bincode;
19use bincode::{
20    config::{
21        AllowTrailing, BigEndian, Bounded, FixintEncoding, Infinite, LittleEndian, NativeEndian,
22        RejectTrailing, VarintEncoding, WithOtherEndian, WithOtherIntEncoding, WithOtherLimit,
23        WithOtherTrailing,
24    },
25    DefaultOptions, Options,
26};
27use serde::{de::DeserializeOwned, ser::Error, Deserialize, Serialize};
28pub use transmog;
29use transmog::{BorrowedDeserializer, Format, OwnedDeserializer};
30
31/// Bincode implementor of [`Format`] with default options.
32#[derive(Clone)]
33#[must_use]
34pub struct Bincode {
35    limit: Option<u64>,
36    endian: Endian,
37    integer_encoding: IntegerEncoding,
38    reject_trailing_bytes: bool,
39}
40
41#[derive(Clone, Copy)]
42enum Endian {
43    Little,
44    Big,
45    Native,
46}
47
48#[derive(Clone, Copy)]
49enum IntegerEncoding {
50    Fixed,
51    Variable,
52}
53
54impl Default for Bincode {
55    /// Returns a `Bincode` instance initialized using the equivalent of [`DefaultOptions`].
56    fn default() -> Self {
57        Self {
58            limit: None,
59            endian: Endian::Little,
60            integer_encoding: IntegerEncoding::Variable,
61            reject_trailing_bytes: true,
62        }
63    }
64}
65
66impl Bincode {
67    /// Returns a `Bincode` instance initialized using the equivalent settings
68    /// that [`bincode::serialize`], [`bincode::deserialize`],
69    /// [`bincode::serialize_into`], and [`bincode::deserialize_from`] use. See
70    /// [`bincode::config`](mod@bincode::config) for more information.
71    pub fn legacy_default() -> Self {
72        Self::default()
73            .fixed_integer_encoding()
74            .allow_trailing_bytes()
75    }
76
77    /// Configures no byte limit. See [`Infinite`] for more information.
78    pub fn no_limit(mut self) -> Self {
79        self.limit = None;
80        self
81    }
82
83    /// Configures bincode to restrict encoding and decoding to `byte_limit`. See [`Bounded`] for more information.
84    pub fn limit(mut self, byte_limit: u64) -> Self {
85        self.limit = Some(byte_limit);
86        self
87    }
88
89    /// Configures big-endian encoding. See [`BigEndian`] for more information.
90    pub fn big_endian(mut self) -> Self {
91        self.endian = Endian::Big;
92        self
93    }
94
95    /// Configures little-endian encoding. See [`LittleEndian`] for more information.
96    pub fn little_endian(mut self) -> Self {
97        self.endian = Endian::Little;
98        self
99    }
100
101    /// Configures native-endian encoding. See [`NativeEndian`] for more information.
102    pub fn native_endian(mut self) -> Self {
103        self.endian = Endian::Native;
104        self
105    }
106
107    /// Configures variable length integer encoding. See [`VarintEncoding`] for more information.
108    pub fn variable_integer_encoding(mut self) -> Self {
109        self.integer_encoding = IntegerEncoding::Variable;
110        self
111    }
112
113    /// Configures fixed length integer encoding. See [`FixintEncoding`] for more information.
114    pub fn fixed_integer_encoding(mut self) -> Self {
115        self.integer_encoding = IntegerEncoding::Fixed;
116        self
117    }
118
119    /// Configures Bincode to allow trailing bytes when deserializing. See [`AllowTrailing`] for more information.
120    pub fn allow_trailing_bytes(mut self) -> Self {
121        self.reject_trailing_bytes = false;
122        self
123    }
124
125    /// Configures Bincode to reject trailing bytes when deserializing. See [`RejectTrailing`] for more information.
126    pub fn reject_trailing_bytes(mut self) -> Self {
127        self.reject_trailing_bytes = true;
128        self
129    }
130}
131
132impl<'a> From<&Bincode> for BincodeOptions {
133    #[allow(clippy::too_many_lines)]
134    fn from(settings: &Bincode) -> Self {
135        match (
136            settings.limit,
137            settings.endian,
138            settings.integer_encoding,
139            settings.reject_trailing_bytes,
140        ) {
141            (None, Endian::Little, IntegerEncoding::Fixed, true) => {
142                Self::UnlimitedLittleFixintReject(
143                    DefaultOptions::default()
144                        .reject_trailing_bytes()
145                        .with_fixint_encoding()
146                        .with_little_endian()
147                        .with_no_limit(),
148                )
149            }
150            (None, Endian::Little, IntegerEncoding::Fixed, false) => {
151                Self::UnlimitedLittleFixintAllow(
152                    DefaultOptions::default()
153                        .allow_trailing_bytes()
154                        .with_fixint_encoding()
155                        .with_little_endian()
156                        .with_no_limit(),
157                )
158            }
159            (None, Endian::Little, IntegerEncoding::Variable, true) => {
160                Self::UnlimitedLittleVarintReject(
161                    DefaultOptions::default()
162                        .reject_trailing_bytes()
163                        .with_varint_encoding()
164                        .with_little_endian()
165                        .with_no_limit(),
166                )
167            }
168            (None, Endian::Little, IntegerEncoding::Variable, false) => {
169                Self::UnlimitedLittleVarintAllow(
170                    DefaultOptions::default()
171                        .allow_trailing_bytes()
172                        .with_varint_encoding()
173                        .with_little_endian()
174                        .with_no_limit(),
175                )
176            }
177            (None, Endian::Big, IntegerEncoding::Fixed, true) => Self::UnlimitedBigFixintReject(
178                DefaultOptions::default()
179                    .reject_trailing_bytes()
180                    .with_fixint_encoding()
181                    .with_big_endian()
182                    .with_no_limit(),
183            ),
184            (None, Endian::Big, IntegerEncoding::Fixed, false) => Self::UnlimitedBigFixintAllow(
185                DefaultOptions::default()
186                    .allow_trailing_bytes()
187                    .with_fixint_encoding()
188                    .with_big_endian()
189                    .with_no_limit(),
190            ),
191            (None, Endian::Big, IntegerEncoding::Variable, true) => Self::UnlimitedBigVarintReject(
192                DefaultOptions::default()
193                    .reject_trailing_bytes()
194                    .with_varint_encoding()
195                    .with_big_endian()
196                    .with_no_limit(),
197            ),
198            (None, Endian::Big, IntegerEncoding::Variable, false) => Self::UnlimitedBigVarintAllow(
199                DefaultOptions::default()
200                    .allow_trailing_bytes()
201                    .with_varint_encoding()
202                    .with_big_endian()
203                    .with_no_limit(),
204            ),
205            (None, Endian::Native, IntegerEncoding::Fixed, true) => {
206                Self::UnlimitedNativeFixintReject(
207                    DefaultOptions::default()
208                        .reject_trailing_bytes()
209                        .with_fixint_encoding()
210                        .with_native_endian()
211                        .with_no_limit(),
212                )
213            }
214            (None, Endian::Native, IntegerEncoding::Fixed, false) => {
215                Self::UnlimitedNativeFixintAllow(
216                    DefaultOptions::default()
217                        .allow_trailing_bytes()
218                        .with_fixint_encoding()
219                        .with_native_endian()
220                        .with_no_limit(),
221                )
222            }
223            (None, Endian::Native, IntegerEncoding::Variable, true) => {
224                Self::UnlimitedNativeVarintReject(
225                    DefaultOptions::default()
226                        .reject_trailing_bytes()
227                        .with_varint_encoding()
228                        .with_native_endian()
229                        .with_no_limit(),
230                )
231            }
232            (None, Endian::Native, IntegerEncoding::Variable, false) => {
233                Self::UnlimitedNativeVarintAllow(
234                    DefaultOptions::default()
235                        .allow_trailing_bytes()
236                        .with_varint_encoding()
237                        .with_native_endian()
238                        .with_no_limit(),
239                )
240            }
241            (Some(limit), Endian::Little, IntegerEncoding::Fixed, true) => {
242                Self::LimitedLittleFixintReject(
243                    DefaultOptions::default()
244                        .reject_trailing_bytes()
245                        .with_fixint_encoding()
246                        .with_little_endian()
247                        .with_limit(limit),
248                )
249            }
250            (Some(limit), Endian::Little, IntegerEncoding::Fixed, false) => {
251                Self::LimitedLittleFixintAllow(
252                    DefaultOptions::default()
253                        .allow_trailing_bytes()
254                        .with_fixint_encoding()
255                        .with_little_endian()
256                        .with_limit(limit),
257                )
258            }
259            (Some(limit), Endian::Little, IntegerEncoding::Variable, true) => {
260                Self::LimitedLittleVarintReject(
261                    DefaultOptions::default()
262                        .reject_trailing_bytes()
263                        .with_varint_encoding()
264                        .with_little_endian()
265                        .with_limit(limit),
266                )
267            }
268            (Some(limit), Endian::Little, IntegerEncoding::Variable, false) => {
269                Self::LimitedLittleVarintAllow(
270                    DefaultOptions::default()
271                        .allow_trailing_bytes()
272                        .with_varint_encoding()
273                        .with_little_endian()
274                        .with_limit(limit),
275                )
276            }
277            (Some(limit), Endian::Big, IntegerEncoding::Fixed, true) => {
278                Self::LimitedBigFixintReject(
279                    DefaultOptions::default()
280                        .reject_trailing_bytes()
281                        .with_fixint_encoding()
282                        .with_big_endian()
283                        .with_limit(limit),
284                )
285            }
286            (Some(limit), Endian::Big, IntegerEncoding::Fixed, false) => {
287                Self::LimitedBigFixintAllow(
288                    DefaultOptions::default()
289                        .allow_trailing_bytes()
290                        .with_fixint_encoding()
291                        .with_big_endian()
292                        .with_limit(limit),
293                )
294            }
295            (Some(limit), Endian::Big, IntegerEncoding::Variable, true) => {
296                Self::LimitedBigVarintReject(
297                    DefaultOptions::default()
298                        .reject_trailing_bytes()
299                        .with_varint_encoding()
300                        .with_big_endian()
301                        .with_limit(limit),
302                )
303            }
304            (Some(limit), Endian::Big, IntegerEncoding::Variable, false) => {
305                Self::LimitedBigVarintAllow(
306                    DefaultOptions::default()
307                        .allow_trailing_bytes()
308                        .with_varint_encoding()
309                        .with_big_endian()
310                        .with_limit(limit),
311                )
312            }
313            (Some(limit), Endian::Native, IntegerEncoding::Fixed, true) => {
314                Self::LimitedNativeFixintReject(
315                    DefaultOptions::default()
316                        .reject_trailing_bytes()
317                        .with_fixint_encoding()
318                        .with_native_endian()
319                        .with_limit(limit),
320                )
321            }
322            (Some(limit), Endian::Native, IntegerEncoding::Fixed, false) => {
323                Self::LimitedNativeFixintAllow(
324                    DefaultOptions::default()
325                        .allow_trailing_bytes()
326                        .with_fixint_encoding()
327                        .with_native_endian()
328                        .with_limit(limit),
329                )
330            }
331            (Some(limit), Endian::Native, IntegerEncoding::Variable, true) => {
332                Self::LimitedNativeVarintReject(
333                    DefaultOptions::default()
334                        .reject_trailing_bytes()
335                        .with_varint_encoding()
336                        .with_native_endian()
337                        .with_limit(limit),
338                )
339            }
340            (Some(limit), Endian::Native, IntegerEncoding::Variable, false) => {
341                Self::LimitedNativeVarintAllow(
342                    DefaultOptions::default()
343                        .allow_trailing_bytes()
344                        .with_varint_encoding()
345                        .with_native_endian()
346                        .with_limit(limit),
347                )
348            }
349        }
350    }
351}
352
353#[allow(clippy::type_complexity)]
354enum BincodeOptions {
355    UnlimitedLittleVarintReject(
356        WithOtherLimit<
357            WithOtherEndian<
358                WithOtherIntEncoding<
359                    WithOtherTrailing<DefaultOptions, RejectTrailing>,
360                    VarintEncoding,
361                >,
362                LittleEndian,
363            >,
364            Infinite,
365        >,
366    ),
367    UnlimitedLittleVarintAllow(
368        WithOtherLimit<
369            WithOtherEndian<
370                WithOtherIntEncoding<
371                    WithOtherTrailing<DefaultOptions, AllowTrailing>,
372                    VarintEncoding,
373                >,
374                LittleEndian,
375            >,
376            Infinite,
377        >,
378    ),
379    UnlimitedLittleFixintReject(
380        WithOtherLimit<
381            WithOtherEndian<
382                WithOtherIntEncoding<
383                    WithOtherTrailing<DefaultOptions, RejectTrailing>,
384                    FixintEncoding,
385                >,
386                LittleEndian,
387            >,
388            Infinite,
389        >,
390    ),
391    UnlimitedLittleFixintAllow(
392        WithOtherLimit<
393            WithOtherEndian<
394                WithOtherIntEncoding<
395                    WithOtherTrailing<DefaultOptions, AllowTrailing>,
396                    FixintEncoding,
397                >,
398                LittleEndian,
399            >,
400            Infinite,
401        >,
402    ),
403    UnlimitedBigVarintReject(
404        WithOtherLimit<
405            WithOtherEndian<
406                WithOtherIntEncoding<
407                    WithOtherTrailing<DefaultOptions, RejectTrailing>,
408                    VarintEncoding,
409                >,
410                BigEndian,
411            >,
412            Infinite,
413        >,
414    ),
415    UnlimitedBigVarintAllow(
416        WithOtherLimit<
417            WithOtherEndian<
418                WithOtherIntEncoding<
419                    WithOtherTrailing<DefaultOptions, AllowTrailing>,
420                    VarintEncoding,
421                >,
422                BigEndian,
423            >,
424            Infinite,
425        >,
426    ),
427    UnlimitedBigFixintReject(
428        WithOtherLimit<
429            WithOtherEndian<
430                WithOtherIntEncoding<
431                    WithOtherTrailing<DefaultOptions, RejectTrailing>,
432                    FixintEncoding,
433                >,
434                BigEndian,
435            >,
436            Infinite,
437        >,
438    ),
439    UnlimitedBigFixintAllow(
440        WithOtherLimit<
441            WithOtherEndian<
442                WithOtherIntEncoding<
443                    WithOtherTrailing<DefaultOptions, AllowTrailing>,
444                    FixintEncoding,
445                >,
446                BigEndian,
447            >,
448            Infinite,
449        >,
450    ),
451    UnlimitedNativeVarintReject(
452        WithOtherLimit<
453            WithOtherEndian<
454                WithOtherIntEncoding<
455                    WithOtherTrailing<DefaultOptions, RejectTrailing>,
456                    VarintEncoding,
457                >,
458                NativeEndian,
459            >,
460            Infinite,
461        >,
462    ),
463    UnlimitedNativeVarintAllow(
464        WithOtherLimit<
465            WithOtherEndian<
466                WithOtherIntEncoding<
467                    WithOtherTrailing<DefaultOptions, AllowTrailing>,
468                    VarintEncoding,
469                >,
470                NativeEndian,
471            >,
472            Infinite,
473        >,
474    ),
475    UnlimitedNativeFixintReject(
476        WithOtherLimit<
477            WithOtherEndian<
478                WithOtherIntEncoding<
479                    WithOtherTrailing<DefaultOptions, RejectTrailing>,
480                    FixintEncoding,
481                >,
482                NativeEndian,
483            >,
484            Infinite,
485        >,
486    ),
487    UnlimitedNativeFixintAllow(
488        WithOtherLimit<
489            WithOtherEndian<
490                WithOtherIntEncoding<
491                    WithOtherTrailing<DefaultOptions, AllowTrailing>,
492                    FixintEncoding,
493                >,
494                NativeEndian,
495            >,
496            Infinite,
497        >,
498    ),
499    LimitedLittleVarintReject(
500        WithOtherLimit<
501            WithOtherEndian<
502                WithOtherIntEncoding<
503                    WithOtherTrailing<DefaultOptions, RejectTrailing>,
504                    VarintEncoding,
505                >,
506                LittleEndian,
507            >,
508            Bounded,
509        >,
510    ),
511    LimitedLittleVarintAllow(
512        WithOtherLimit<
513            WithOtherEndian<
514                WithOtherIntEncoding<
515                    WithOtherTrailing<DefaultOptions, AllowTrailing>,
516                    VarintEncoding,
517                >,
518                LittleEndian,
519            >,
520            Bounded,
521        >,
522    ),
523    LimitedLittleFixintReject(
524        WithOtherLimit<
525            WithOtherEndian<
526                WithOtherIntEncoding<
527                    WithOtherTrailing<DefaultOptions, RejectTrailing>,
528                    FixintEncoding,
529                >,
530                LittleEndian,
531            >,
532            Bounded,
533        >,
534    ),
535    LimitedLittleFixintAllow(
536        WithOtherLimit<
537            WithOtherEndian<
538                WithOtherIntEncoding<
539                    WithOtherTrailing<DefaultOptions, AllowTrailing>,
540                    FixintEncoding,
541                >,
542                LittleEndian,
543            >,
544            Bounded,
545        >,
546    ),
547    LimitedBigVarintReject(
548        WithOtherLimit<
549            WithOtherEndian<
550                WithOtherIntEncoding<
551                    WithOtherTrailing<DefaultOptions, RejectTrailing>,
552                    VarintEncoding,
553                >,
554                BigEndian,
555            >,
556            Bounded,
557        >,
558    ),
559    LimitedBigVarintAllow(
560        WithOtherLimit<
561            WithOtherEndian<
562                WithOtherIntEncoding<
563                    WithOtherTrailing<DefaultOptions, AllowTrailing>,
564                    VarintEncoding,
565                >,
566                BigEndian,
567            >,
568            Bounded,
569        >,
570    ),
571    LimitedBigFixintReject(
572        WithOtherLimit<
573            WithOtherEndian<
574                WithOtherIntEncoding<
575                    WithOtherTrailing<DefaultOptions, RejectTrailing>,
576                    FixintEncoding,
577                >,
578                BigEndian,
579            >,
580            Bounded,
581        >,
582    ),
583    LimitedBigFixintAllow(
584        WithOtherLimit<
585            WithOtherEndian<
586                WithOtherIntEncoding<
587                    WithOtherTrailing<DefaultOptions, AllowTrailing>,
588                    FixintEncoding,
589                >,
590                BigEndian,
591            >,
592            Bounded,
593        >,
594    ),
595    LimitedNativeVarintReject(
596        WithOtherLimit<
597            WithOtherEndian<
598                WithOtherIntEncoding<
599                    WithOtherTrailing<DefaultOptions, RejectTrailing>,
600                    VarintEncoding,
601                >,
602                NativeEndian,
603            >,
604            Bounded,
605        >,
606    ),
607    LimitedNativeVarintAllow(
608        WithOtherLimit<
609            WithOtherEndian<
610                WithOtherIntEncoding<
611                    WithOtherTrailing<DefaultOptions, AllowTrailing>,
612                    VarintEncoding,
613                >,
614                NativeEndian,
615            >,
616            Bounded,
617        >,
618    ),
619    LimitedNativeFixintReject(
620        WithOtherLimit<
621            WithOtherEndian<
622                WithOtherIntEncoding<
623                    WithOtherTrailing<DefaultOptions, RejectTrailing>,
624                    FixintEncoding,
625                >,
626                NativeEndian,
627            >,
628            Bounded,
629        >,
630    ),
631    LimitedNativeFixintAllow(
632        WithOtherLimit<
633            WithOtherEndian<
634                WithOtherIntEncoding<
635                    WithOtherTrailing<DefaultOptions, AllowTrailing>,
636                    FixintEncoding,
637                >,
638                NativeEndian,
639            >,
640            Bounded,
641        >,
642    ),
643}
644
645impl<'a, T> Format<'a, T> for Bincode
646where
647    T: Serialize,
648{
649    type Error = bincode::Error;
650
651    fn serialized_size(&self, value: &T) -> Result<Option<usize>, Self::Error> {
652        BincodeOptions::from(self).serialized_size(value)
653    }
654
655    fn serialize(&self, value: &T) -> Result<Vec<u8>, Self::Error> {
656        BincodeOptions::from(self).serialize(value)
657    }
658
659    fn serialize_into<W: Write>(&self, value: &T, writer: W) -> Result<(), Self::Error> {
660        BincodeOptions::from(self).serialize_into(value, writer)
661    }
662}
663
664impl<'a, T> BorrowedDeserializer<'a, T> for Bincode
665where
666    T: Serialize + Deserialize<'a>,
667{
668    fn deserialize_borrowed(&self, data: &'a [u8]) -> Result<T, Self::Error> {
669        BincodeOptions::from(self).deserialize_borrowed(data)
670    }
671}
672
673impl<T> OwnedDeserializer<T> for Bincode
674where
675    T: Serialize + DeserializeOwned,
676{
677    fn deserialize_from<R: Read>(&self, reader: R) -> Result<T, Self::Error> {
678        BincodeOptions::from(self).deserialize_from(reader)
679    }
680
681    fn deserialize_owned(&self, data: &[u8]) -> Result<T, Self::Error> {
682        BincodeOptions::from(self).deserialize_owned(data)
683    }
684}
685
686impl<'a, T> Format<'a, T> for BincodeOptions
687where
688    T: Serialize,
689{
690    type Error = bincode::Error;
691
692    fn serialized_size(&self, value: &T) -> Result<Option<usize>, Self::Error> {
693        match self {
694            BincodeOptions::UnlimitedLittleVarintReject(options) => options.serialized_size(value),
695            BincodeOptions::UnlimitedLittleVarintAllow(options) => options.serialized_size(value),
696            BincodeOptions::UnlimitedLittleFixintReject(options) => options.serialized_size(value),
697            BincodeOptions::UnlimitedLittleFixintAllow(options) => options.serialized_size(value),
698            BincodeOptions::UnlimitedBigVarintReject(options) => options.serialized_size(value),
699            BincodeOptions::UnlimitedBigVarintAllow(options) => options.serialized_size(value),
700            BincodeOptions::UnlimitedBigFixintReject(options) => options.serialized_size(value),
701            BincodeOptions::UnlimitedBigFixintAllow(options) => options.serialized_size(value),
702            BincodeOptions::UnlimitedNativeVarintReject(options) => options.serialized_size(value),
703            BincodeOptions::UnlimitedNativeVarintAllow(options) => options.serialized_size(value),
704            BincodeOptions::UnlimitedNativeFixintReject(options) => options.serialized_size(value),
705            BincodeOptions::UnlimitedNativeFixintAllow(options) => options.serialized_size(value),
706            BincodeOptions::LimitedLittleVarintReject(options) => options.serialized_size(value),
707            BincodeOptions::LimitedLittleVarintAllow(options) => options.serialized_size(value),
708            BincodeOptions::LimitedLittleFixintReject(options) => options.serialized_size(value),
709            BincodeOptions::LimitedLittleFixintAllow(options) => options.serialized_size(value),
710            BincodeOptions::LimitedBigVarintReject(options) => options.serialized_size(value),
711            BincodeOptions::LimitedBigVarintAllow(options) => options.serialized_size(value),
712            BincodeOptions::LimitedBigFixintReject(options) => options.serialized_size(value),
713            BincodeOptions::LimitedBigFixintAllow(options) => options.serialized_size(value),
714            BincodeOptions::LimitedNativeVarintReject(options) => options.serialized_size(value),
715            BincodeOptions::LimitedNativeVarintAllow(options) => options.serialized_size(value),
716            BincodeOptions::LimitedNativeFixintReject(options) => options.serialized_size(value),
717            BincodeOptions::LimitedNativeFixintAllow(options) => options.serialized_size(value),
718        }
719        .and_then(|size| {
720            usize::try_from(size)
721                .map(Some)
722                .map_err(bincode::Error::custom)
723        })
724    }
725
726    fn serialize(&self, value: &T) -> Result<Vec<u8>, Self::Error> {
727        match self {
728            BincodeOptions::UnlimitedLittleVarintReject(options) => options.serialize(value),
729            BincodeOptions::UnlimitedLittleVarintAllow(options) => options.serialize(value),
730            BincodeOptions::UnlimitedLittleFixintReject(options) => options.serialize(value),
731            BincodeOptions::UnlimitedLittleFixintAllow(options) => options.serialize(value),
732            BincodeOptions::UnlimitedBigVarintReject(options) => options.serialize(value),
733            BincodeOptions::UnlimitedBigVarintAllow(options) => options.serialize(value),
734            BincodeOptions::UnlimitedBigFixintReject(options) => options.serialize(value),
735            BincodeOptions::UnlimitedBigFixintAllow(options) => options.serialize(value),
736            BincodeOptions::UnlimitedNativeVarintReject(options) => options.serialize(value),
737            BincodeOptions::UnlimitedNativeVarintAllow(options) => options.serialize(value),
738            BincodeOptions::UnlimitedNativeFixintReject(options) => options.serialize(value),
739            BincodeOptions::UnlimitedNativeFixintAllow(options) => options.serialize(value),
740            BincodeOptions::LimitedLittleVarintReject(options) => options.serialize(value),
741            BincodeOptions::LimitedLittleVarintAllow(options) => options.serialize(value),
742            BincodeOptions::LimitedLittleFixintReject(options) => options.serialize(value),
743            BincodeOptions::LimitedLittleFixintAllow(options) => options.serialize(value),
744            BincodeOptions::LimitedBigVarintReject(options) => options.serialize(value),
745            BincodeOptions::LimitedBigVarintAllow(options) => options.serialize(value),
746            BincodeOptions::LimitedBigFixintReject(options) => options.serialize(value),
747            BincodeOptions::LimitedBigFixintAllow(options) => options.serialize(value),
748            BincodeOptions::LimitedNativeVarintReject(options) => options.serialize(value),
749            BincodeOptions::LimitedNativeVarintAllow(options) => options.serialize(value),
750            BincodeOptions::LimitedNativeFixintReject(options) => options.serialize(value),
751            BincodeOptions::LimitedNativeFixintAllow(options) => options.serialize(value),
752        }
753    }
754
755    fn serialize_into<W: Write>(&self, value: &T, writer: W) -> Result<(), Self::Error> {
756        match self {
757            BincodeOptions::UnlimitedLittleVarintReject(options) => {
758                options.serialize_into(writer, value)
759            }
760            BincodeOptions::UnlimitedLittleVarintAllow(options) => {
761                options.serialize_into(writer, value)
762            }
763            BincodeOptions::UnlimitedLittleFixintReject(options) => {
764                options.serialize_into(writer, value)
765            }
766            BincodeOptions::UnlimitedLittleFixintAllow(options) => {
767                options.serialize_into(writer, value)
768            }
769            BincodeOptions::UnlimitedBigVarintReject(options) => {
770                options.serialize_into(writer, value)
771            }
772            BincodeOptions::UnlimitedBigVarintAllow(options) => {
773                options.serialize_into(writer, value)
774            }
775            BincodeOptions::UnlimitedBigFixintReject(options) => {
776                options.serialize_into(writer, value)
777            }
778            BincodeOptions::UnlimitedBigFixintAllow(options) => {
779                options.serialize_into(writer, value)
780            }
781            BincodeOptions::UnlimitedNativeVarintReject(options) => {
782                options.serialize_into(writer, value)
783            }
784            BincodeOptions::UnlimitedNativeVarintAllow(options) => {
785                options.serialize_into(writer, value)
786            }
787            BincodeOptions::UnlimitedNativeFixintReject(options) => {
788                options.serialize_into(writer, value)
789            }
790            BincodeOptions::UnlimitedNativeFixintAllow(options) => {
791                options.serialize_into(writer, value)
792            }
793            BincodeOptions::LimitedLittleVarintReject(options) => {
794                options.serialize_into(writer, value)
795            }
796            BincodeOptions::LimitedLittleVarintAllow(options) => {
797                options.serialize_into(writer, value)
798            }
799            BincodeOptions::LimitedLittleFixintReject(options) => {
800                options.serialize_into(writer, value)
801            }
802            BincodeOptions::LimitedLittleFixintAllow(options) => {
803                options.serialize_into(writer, value)
804            }
805            BincodeOptions::LimitedBigVarintReject(options) => {
806                options.serialize_into(writer, value)
807            }
808            BincodeOptions::LimitedBigVarintAllow(options) => options.serialize_into(writer, value),
809            BincodeOptions::LimitedBigFixintReject(options) => {
810                options.serialize_into(writer, value)
811            }
812            BincodeOptions::LimitedBigFixintAllow(options) => options.serialize_into(writer, value),
813            BincodeOptions::LimitedNativeVarintReject(options) => {
814                options.serialize_into(writer, value)
815            }
816            BincodeOptions::LimitedNativeVarintAllow(options) => {
817                options.serialize_into(writer, value)
818            }
819            BincodeOptions::LimitedNativeFixintReject(options) => {
820                options.serialize_into(writer, value)
821            }
822            BincodeOptions::LimitedNativeFixintAllow(options) => {
823                options.serialize_into(writer, value)
824            }
825        }
826    }
827}
828
829impl<'a, T> BorrowedDeserializer<'a, T> for BincodeOptions
830where
831    T: Serialize + Deserialize<'a>,
832{
833    fn deserialize_borrowed(&self, data: &'a [u8]) -> Result<T, Self::Error> {
834        match self {
835            BincodeOptions::UnlimitedLittleVarintReject(options) => options.deserialize(data),
836            BincodeOptions::UnlimitedLittleVarintAllow(options) => options.deserialize(data),
837            BincodeOptions::UnlimitedLittleFixintReject(options) => options.deserialize(data),
838            BincodeOptions::UnlimitedLittleFixintAllow(options) => options.deserialize(data),
839            BincodeOptions::UnlimitedBigVarintReject(options) => options.deserialize(data),
840            BincodeOptions::UnlimitedBigVarintAllow(options) => options.deserialize(data),
841            BincodeOptions::UnlimitedBigFixintReject(options) => options.deserialize(data),
842            BincodeOptions::UnlimitedBigFixintAllow(options) => options.deserialize(data),
843            BincodeOptions::UnlimitedNativeVarintReject(options) => options.deserialize(data),
844            BincodeOptions::UnlimitedNativeVarintAllow(options) => options.deserialize(data),
845            BincodeOptions::UnlimitedNativeFixintReject(options) => options.deserialize(data),
846            BincodeOptions::UnlimitedNativeFixintAllow(options) => options.deserialize(data),
847            BincodeOptions::LimitedLittleVarintReject(options) => options.deserialize(data),
848            BincodeOptions::LimitedLittleVarintAllow(options) => options.deserialize(data),
849            BincodeOptions::LimitedLittleFixintReject(options) => options.deserialize(data),
850            BincodeOptions::LimitedLittleFixintAllow(options) => options.deserialize(data),
851            BincodeOptions::LimitedBigVarintReject(options) => options.deserialize(data),
852            BincodeOptions::LimitedBigVarintAllow(options) => options.deserialize(data),
853            BincodeOptions::LimitedBigFixintReject(options) => options.deserialize(data),
854            BincodeOptions::LimitedBigFixintAllow(options) => options.deserialize(data),
855            BincodeOptions::LimitedNativeVarintReject(options) => options.deserialize(data),
856            BincodeOptions::LimitedNativeVarintAllow(options) => options.deserialize(data),
857            BincodeOptions::LimitedNativeFixintReject(options) => options.deserialize(data),
858            BincodeOptions::LimitedNativeFixintAllow(options) => options.deserialize(data),
859        }
860    }
861}
862
863impl<T> OwnedDeserializer<T> for BincodeOptions
864where
865    T: Serialize + DeserializeOwned,
866{
867    fn deserialize_owned(&self, data: &[u8]) -> Result<T, Self::Error> {
868        match self {
869            BincodeOptions::UnlimitedLittleVarintReject(options) => options.deserialize(data),
870            BincodeOptions::UnlimitedLittleVarintAllow(options) => options.deserialize(data),
871            BincodeOptions::UnlimitedLittleFixintReject(options) => options.deserialize(data),
872            BincodeOptions::UnlimitedLittleFixintAllow(options) => options.deserialize(data),
873            BincodeOptions::UnlimitedBigVarintReject(options) => options.deserialize(data),
874            BincodeOptions::UnlimitedBigVarintAllow(options) => options.deserialize(data),
875            BincodeOptions::UnlimitedBigFixintReject(options) => options.deserialize(data),
876            BincodeOptions::UnlimitedBigFixintAllow(options) => options.deserialize(data),
877            BincodeOptions::UnlimitedNativeVarintReject(options) => options.deserialize(data),
878            BincodeOptions::UnlimitedNativeVarintAllow(options) => options.deserialize(data),
879            BincodeOptions::UnlimitedNativeFixintReject(options) => options.deserialize(data),
880            BincodeOptions::UnlimitedNativeFixintAllow(options) => options.deserialize(data),
881            BincodeOptions::LimitedLittleVarintReject(options) => options.deserialize(data),
882            BincodeOptions::LimitedLittleVarintAllow(options) => options.deserialize(data),
883            BincodeOptions::LimitedLittleFixintReject(options) => options.deserialize(data),
884            BincodeOptions::LimitedLittleFixintAllow(options) => options.deserialize(data),
885            BincodeOptions::LimitedBigVarintReject(options) => options.deserialize(data),
886            BincodeOptions::LimitedBigVarintAllow(options) => options.deserialize(data),
887            BincodeOptions::LimitedBigFixintReject(options) => options.deserialize(data),
888            BincodeOptions::LimitedBigFixintAllow(options) => options.deserialize(data),
889            BincodeOptions::LimitedNativeVarintReject(options) => options.deserialize(data),
890            BincodeOptions::LimitedNativeVarintAllow(options) => options.deserialize(data),
891            BincodeOptions::LimitedNativeFixintReject(options) => options.deserialize(data),
892            BincodeOptions::LimitedNativeFixintAllow(options) => options.deserialize(data),
893        }
894    }
895
896    fn deserialize_from<R: Read>(&self, reader: R) -> Result<T, Self::Error> {
897        match self {
898            BincodeOptions::UnlimitedLittleVarintReject(options) => {
899                options.deserialize_from(reader)
900            }
901            BincodeOptions::UnlimitedLittleVarintAllow(options) => options.deserialize_from(reader),
902            BincodeOptions::UnlimitedLittleFixintReject(options) => {
903                options.deserialize_from(reader)
904            }
905            BincodeOptions::UnlimitedLittleFixintAllow(options) => options.deserialize_from(reader),
906            BincodeOptions::UnlimitedBigVarintReject(options) => options.deserialize_from(reader),
907            BincodeOptions::UnlimitedBigVarintAllow(options) => options.deserialize_from(reader),
908            BincodeOptions::UnlimitedBigFixintReject(options) => options.deserialize_from(reader),
909            BincodeOptions::UnlimitedBigFixintAllow(options) => options.deserialize_from(reader),
910            BincodeOptions::UnlimitedNativeVarintReject(options) => {
911                options.deserialize_from(reader)
912            }
913            BincodeOptions::UnlimitedNativeVarintAllow(options) => options.deserialize_from(reader),
914            BincodeOptions::UnlimitedNativeFixintReject(options) => {
915                options.deserialize_from(reader)
916            }
917            BincodeOptions::UnlimitedNativeFixintAllow(options) => options.deserialize_from(reader),
918            BincodeOptions::LimitedLittleVarintReject(options) => options.deserialize_from(reader),
919            BincodeOptions::LimitedLittleVarintAllow(options) => options.deserialize_from(reader),
920            BincodeOptions::LimitedLittleFixintReject(options) => options.deserialize_from(reader),
921            BincodeOptions::LimitedLittleFixintAllow(options) => options.deserialize_from(reader),
922            BincodeOptions::LimitedBigVarintReject(options) => options.deserialize_from(reader),
923            BincodeOptions::LimitedBigVarintAllow(options) => options.deserialize_from(reader),
924            BincodeOptions::LimitedBigFixintReject(options) => options.deserialize_from(reader),
925            BincodeOptions::LimitedBigFixintAllow(options) => options.deserialize_from(reader),
926            BincodeOptions::LimitedNativeVarintReject(options) => options.deserialize_from(reader),
927            BincodeOptions::LimitedNativeVarintAllow(options) => options.deserialize_from(reader),
928            BincodeOptions::LimitedNativeFixintReject(options) => options.deserialize_from(reader),
929            BincodeOptions::LimitedNativeFixintAllow(options) => options.deserialize_from(reader),
930        }
931    }
932}
933
934#[test]
935#[allow(clippy::too_many_lines)]
936fn format_tests() {
937    transmog::test_util::test_format(&Bincode::legacy_default());
938    transmog::test_util::test_format(
939        &Bincode::default()
940            .no_limit()
941            .little_endian()
942            .variable_integer_encoding()
943            .reject_trailing_bytes(),
944    );
945    transmog::test_util::test_format(
946        &Bincode::default()
947            .no_limit()
948            .little_endian()
949            .variable_integer_encoding()
950            .allow_trailing_bytes(),
951    );
952    transmog::test_util::test_format(
953        &Bincode::default()
954            .no_limit()
955            .little_endian()
956            .fixed_integer_encoding()
957            .reject_trailing_bytes(),
958    );
959    transmog::test_util::test_format(
960        &Bincode::default()
961            .no_limit()
962            .little_endian()
963            .fixed_integer_encoding()
964            .allow_trailing_bytes(),
965    );
966    transmog::test_util::test_format(
967        &Bincode::default()
968            .no_limit()
969            .big_endian()
970            .variable_integer_encoding()
971            .reject_trailing_bytes(),
972    );
973    transmog::test_util::test_format(
974        &Bincode::default()
975            .no_limit()
976            .big_endian()
977            .variable_integer_encoding()
978            .allow_trailing_bytes(),
979    );
980    transmog::test_util::test_format(
981        &Bincode::default()
982            .no_limit()
983            .big_endian()
984            .fixed_integer_encoding()
985            .reject_trailing_bytes(),
986    );
987    transmog::test_util::test_format(
988        &Bincode::default()
989            .no_limit()
990            .big_endian()
991            .fixed_integer_encoding()
992            .allow_trailing_bytes(),
993    );
994    transmog::test_util::test_format(
995        &Bincode::default()
996            .no_limit()
997            .native_endian()
998            .variable_integer_encoding()
999            .reject_trailing_bytes(),
1000    );
1001    transmog::test_util::test_format(
1002        &Bincode::default()
1003            .no_limit()
1004            .native_endian()
1005            .variable_integer_encoding()
1006            .allow_trailing_bytes(),
1007    );
1008    transmog::test_util::test_format(
1009        &Bincode::default()
1010            .no_limit()
1011            .native_endian()
1012            .fixed_integer_encoding()
1013            .reject_trailing_bytes(),
1014    );
1015    transmog::test_util::test_format(
1016        &Bincode::default()
1017            .no_limit()
1018            .native_endian()
1019            .fixed_integer_encoding()
1020            .allow_trailing_bytes(),
1021    );
1022    transmog::test_util::test_format(
1023        &Bincode::default()
1024            .limit(64)
1025            .little_endian()
1026            .variable_integer_encoding()
1027            .reject_trailing_bytes(),
1028    );
1029    transmog::test_util::test_format(
1030        &Bincode::default()
1031            .limit(64)
1032            .little_endian()
1033            .variable_integer_encoding()
1034            .allow_trailing_bytes(),
1035    );
1036    transmog::test_util::test_format(
1037        &Bincode::default()
1038            .limit(64)
1039            .little_endian()
1040            .fixed_integer_encoding()
1041            .reject_trailing_bytes(),
1042    );
1043    transmog::test_util::test_format(
1044        &Bincode::default()
1045            .limit(64)
1046            .little_endian()
1047            .fixed_integer_encoding()
1048            .allow_trailing_bytes(),
1049    );
1050    transmog::test_util::test_format(
1051        &Bincode::default()
1052            .limit(64)
1053            .big_endian()
1054            .variable_integer_encoding()
1055            .reject_trailing_bytes(),
1056    );
1057    transmog::test_util::test_format(
1058        &Bincode::default()
1059            .limit(64)
1060            .big_endian()
1061            .variable_integer_encoding()
1062            .allow_trailing_bytes(),
1063    );
1064    transmog::test_util::test_format(
1065        &Bincode::default()
1066            .limit(64)
1067            .big_endian()
1068            .fixed_integer_encoding()
1069            .reject_trailing_bytes(),
1070    );
1071    transmog::test_util::test_format(
1072        &Bincode::default()
1073            .limit(64)
1074            .big_endian()
1075            .fixed_integer_encoding()
1076            .allow_trailing_bytes(),
1077    );
1078    transmog::test_util::test_format(
1079        &Bincode::default()
1080            .limit(64)
1081            .native_endian()
1082            .variable_integer_encoding()
1083            .reject_trailing_bytes(),
1084    );
1085    transmog::test_util::test_format(
1086        &Bincode::default()
1087            .limit(64)
1088            .native_endian()
1089            .variable_integer_encoding()
1090            .allow_trailing_bytes(),
1091    );
1092    transmog::test_util::test_format(
1093        &Bincode::default()
1094            .limit(64)
1095            .native_endian()
1096            .fixed_integer_encoding()
1097            .reject_trailing_bytes(),
1098    );
1099    transmog::test_util::test_format(
1100        &Bincode::default()
1101            .limit(64)
1102            .native_endian()
1103            .fixed_integer_encoding()
1104            .allow_trailing_bytes(),
1105    );
1106}