1#![doc = include_str!("./.crate-docs.md")]
2#![forbid(unsafe_code)]
3#![warn(
4 clippy::cargo,
5 missing_docs,
6 clippy::pedantic,
8 future_incompatible,
9 rust_2018_idioms,
10)]
11#![allow(
12 clippy::missing_errors_doc, 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#[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 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 pub fn legacy_default() -> Self {
72 Self::default()
73 .fixed_integer_encoding()
74 .allow_trailing_bytes()
75 }
76
77 pub fn no_limit(mut self) -> Self {
79 self.limit = None;
80 self
81 }
82
83 pub fn limit(mut self, byte_limit: u64) -> Self {
85 self.limit = Some(byte_limit);
86 self
87 }
88
89 pub fn big_endian(mut self) -> Self {
91 self.endian = Endian::Big;
92 self
93 }
94
95 pub fn little_endian(mut self) -> Self {
97 self.endian = Endian::Little;
98 self
99 }
100
101 pub fn native_endian(mut self) -> Self {
103 self.endian = Endian::Native;
104 self
105 }
106
107 pub fn variable_integer_encoding(mut self) -> Self {
109 self.integer_encoding = IntegerEncoding::Variable;
110 self
111 }
112
113 pub fn fixed_integer_encoding(mut self) -> Self {
115 self.integer_encoding = IntegerEncoding::Fixed;
116 self
117 }
118
119 pub fn allow_trailing_bytes(mut self) -> Self {
121 self.reject_trailing_bytes = false;
122 self
123 }
124
125 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}