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. check_end(reader: &SliceReader) -> Result<()>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)] check_end(_reader: &SliceReader) -> Result<()>21 fn check_end(_reader: &SliceReader) -> Result<()> { 22 Ok(()) 23 } 24 } 25 26 impl TrailingBytes for RejectTrailing { 27 #[inline(always)] check_end(reader: &SliceReader) -> Result<()>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