| 1 | use de::read::SliceReader;
|
| 2 | use {ErrorKind, Result};
|
| 3 |
|
| 4 | /// A trait for erroring deserialization if not all bytes were read.
|
| 5 | pub trait TrailingBytes {
|
| 6 | /// Checks a given slice reader to determine if deserialization used all bytes in the slice.
|
| 7 | fn check_end(reader: &SliceReader) -> Result<()>;
|
| 8 | }
|
| 9 |
|
| 10 | /// A TrailingBytes config that will allow trailing bytes in slices after deserialization.
|
| 11 | #[derive (Copy, Clone)]
|
| 12 | pub struct AllowTrailing;
|
| 13 |
|
| 14 | /// A TrailingBytes config that will cause bincode to produce an error if bytes are left over in the slice when deserialization is complete.
|
| 15 |
|
| 16 | #[derive (Copy, Clone)]
|
| 17 | pub struct RejectTrailing;
|
| 18 |
|
| 19 | impl TrailingBytes for AllowTrailing {
|
| 20 | #[inline (always)]
|
| 21 | fn check_end(_reader: &SliceReader) -> Result<()> {
|
| 22 | Ok(())
|
| 23 | }
|
| 24 | }
|
| 25 |
|
| 26 | impl TrailingBytes for RejectTrailing {
|
| 27 | #[inline (always)]
|
| 28 | fn check_end(reader: &SliceReader) -> Result<()> {
|
| 29 | if reader.is_finished() {
|
| 30 | Ok(())
|
| 31 | } else {
|
| 32 | Err(Box::new(ErrorKind::Custom(
|
| 33 | "Slice had bytes remaining after deserialization" .to_string(),
|
| 34 | )))
|
| 35 | }
|
| 36 | }
|
| 37 | }
|
| 38 | |