mirror of https://git.sr.ht/~stygianentity/bincode
Added `additional` to the `UnexpectedEnd` decode error (#522)
This commit is contained in:
parent
a7fba80e23
commit
6693276e95
|
|
@ -75,7 +75,9 @@ impl<'storage> Reader for SliceReader<'storage> {
|
||||||
#[inline(always)]
|
#[inline(always)]
|
||||||
fn read(&mut self, bytes: &mut [u8]) -> Result<(), DecodeError> {
|
fn read(&mut self, bytes: &mut [u8]) -> Result<(), DecodeError> {
|
||||||
if bytes.len() > self.slice.len() {
|
if bytes.len() > self.slice.len() {
|
||||||
return Err(DecodeError::UnexpectedEnd);
|
return Err(DecodeError::UnexpectedEnd {
|
||||||
|
additional: bytes.len() - self.slice.len(),
|
||||||
|
});
|
||||||
}
|
}
|
||||||
let (read_slice, remaining) = self.slice.split_at(bytes.len());
|
let (read_slice, remaining) = self.slice.split_at(bytes.len());
|
||||||
bytes.copy_from_slice(read_slice);
|
bytes.copy_from_slice(read_slice);
|
||||||
|
|
@ -99,7 +101,9 @@ impl<'storage> BorrowReader<'storage> for SliceReader<'storage> {
|
||||||
#[inline(always)]
|
#[inline(always)]
|
||||||
fn take_bytes(&mut self, length: usize) -> Result<&'storage [u8], DecodeError> {
|
fn take_bytes(&mut self, length: usize) -> Result<&'storage [u8], DecodeError> {
|
||||||
if length > self.slice.len() {
|
if length > self.slice.len() {
|
||||||
return Err(DecodeError::UnexpectedEnd);
|
return Err(DecodeError::UnexpectedEnd {
|
||||||
|
additional: length - self.slice.len(),
|
||||||
|
});
|
||||||
}
|
}
|
||||||
let (read_slice, remaining) = self.slice.split_at(length);
|
let (read_slice, remaining) = self.slice.split_at(length);
|
||||||
self.slice = remaining;
|
self.slice = remaining;
|
||||||
|
|
|
||||||
|
|
@ -68,7 +68,14 @@ impl core::fmt::Display for EncodeError {
|
||||||
#[derive(Debug, PartialEq)]
|
#[derive(Debug, PartialEq)]
|
||||||
pub enum DecodeError {
|
pub enum DecodeError {
|
||||||
/// The reader reached its end but more bytes were expected.
|
/// The reader reached its end but more bytes were expected.
|
||||||
UnexpectedEnd,
|
UnexpectedEnd {
|
||||||
|
/// Gives an estimate of how many extra bytes are needed.
|
||||||
|
///
|
||||||
|
/// **Note**: this is only an estimate and not indicative of the actual bytes needed.
|
||||||
|
///
|
||||||
|
/// **Note**: Bincode has no look-ahead mechanism. This means that this will only return the amount of bytes to be read for the current action, and not take into account the entire data structure being read.
|
||||||
|
additional: usize,
|
||||||
|
},
|
||||||
|
|
||||||
/// The given configuration limit was exceeded
|
/// The given configuration limit was exceeded
|
||||||
LimitExceeded,
|
LimitExceeded,
|
||||||
|
|
|
||||||
|
|
@ -49,7 +49,9 @@ where
|
||||||
fn read(&mut self, bytes: &mut [u8]) -> Result<(), DecodeError> {
|
fn read(&mut self, bytes: &mut [u8]) -> Result<(), DecodeError> {
|
||||||
match self.reader.read_exact(bytes) {
|
match self.reader.read_exact(bytes) {
|
||||||
Ok(_) => Ok(()),
|
Ok(_) => Ok(()),
|
||||||
Err(_) => Err(DecodeError::UnexpectedEnd),
|
Err(_) => Err(DecodeError::UnexpectedEnd {
|
||||||
|
additional: bytes.len(),
|
||||||
|
}),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -61,7 +63,9 @@ where
|
||||||
fn read(&mut self, bytes: &mut [u8]) -> Result<(), DecodeError> {
|
fn read(&mut self, bytes: &mut [u8]) -> Result<(), DecodeError> {
|
||||||
match self.read_exact(bytes) {
|
match self.read_exact(bytes) {
|
||||||
Ok(_) => Ok(()),
|
Ok(_) => Ok(()),
|
||||||
Err(_) => Err(DecodeError::UnexpectedEnd),
|
Err(_) => Err(DecodeError::UnexpectedEnd {
|
||||||
|
additional: bytes.len(),
|
||||||
|
}),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -422,8 +422,8 @@ fn test_decode_u16() {
|
||||||
found: IntegerType::U128,
|
found: IntegerType::U128,
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
(&[U16_BYTE], DecodeError::UnexpectedEnd),
|
(&[U16_BYTE], DecodeError::UnexpectedEnd { additional: 2 }),
|
||||||
(&[U16_BYTE, 0], DecodeError::UnexpectedEnd),
|
(&[U16_BYTE, 0], DecodeError::UnexpectedEnd { additional: 1 }),
|
||||||
];
|
];
|
||||||
|
|
||||||
for (slice, expected) in errors {
|
for (slice, expected) in errors {
|
||||||
|
|
@ -466,12 +466,18 @@ fn test_decode_u32() {
|
||||||
found: IntegerType::U128,
|
found: IntegerType::U128,
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
(&[U16_BYTE], DecodeError::UnexpectedEnd),
|
(&[U16_BYTE], DecodeError::UnexpectedEnd { additional: 2 }),
|
||||||
(&[U16_BYTE, 0], DecodeError::UnexpectedEnd),
|
(&[U16_BYTE, 0], DecodeError::UnexpectedEnd { additional: 1 }),
|
||||||
(&[U32_BYTE], DecodeError::UnexpectedEnd),
|
(&[U32_BYTE], DecodeError::UnexpectedEnd { additional: 4 }),
|
||||||
(&[U32_BYTE, 0], DecodeError::UnexpectedEnd),
|
(&[U32_BYTE, 0], DecodeError::UnexpectedEnd { additional: 3 }),
|
||||||
(&[U32_BYTE, 0, 0], DecodeError::UnexpectedEnd),
|
(
|
||||||
(&[U32_BYTE, 0, 0, 0], DecodeError::UnexpectedEnd),
|
&[U32_BYTE, 0, 0],
|
||||||
|
DecodeError::UnexpectedEnd { additional: 2 },
|
||||||
|
),
|
||||||
|
(
|
||||||
|
&[U32_BYTE, 0, 0, 0],
|
||||||
|
DecodeError::UnexpectedEnd { additional: 1 },
|
||||||
|
),
|
||||||
];
|
];
|
||||||
|
|
||||||
for (slice, expected) in errors {
|
for (slice, expected) in errors {
|
||||||
|
|
@ -512,20 +518,44 @@ fn test_decode_u64() {
|
||||||
found: IntegerType::U128,
|
found: IntegerType::U128,
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
(&[U16_BYTE], DecodeError::UnexpectedEnd),
|
(&[U16_BYTE], DecodeError::UnexpectedEnd { additional: 2 }),
|
||||||
(&[U16_BYTE, 0], DecodeError::UnexpectedEnd),
|
(&[U16_BYTE, 0], DecodeError::UnexpectedEnd { additional: 1 }),
|
||||||
(&[U32_BYTE], DecodeError::UnexpectedEnd),
|
(&[U32_BYTE], DecodeError::UnexpectedEnd { additional: 4 }),
|
||||||
(&[U32_BYTE, 0], DecodeError::UnexpectedEnd),
|
(&[U32_BYTE, 0], DecodeError::UnexpectedEnd { additional: 3 }),
|
||||||
(&[U32_BYTE, 0, 0], DecodeError::UnexpectedEnd),
|
(
|
||||||
(&[U32_BYTE, 0, 0, 0], DecodeError::UnexpectedEnd),
|
&[U32_BYTE, 0, 0],
|
||||||
(&[U64_BYTE], DecodeError::UnexpectedEnd),
|
DecodeError::UnexpectedEnd { additional: 2 },
|
||||||
(&[U64_BYTE, 0], DecodeError::UnexpectedEnd),
|
),
|
||||||
(&[U64_BYTE, 0, 0], DecodeError::UnexpectedEnd),
|
(
|
||||||
(&[U64_BYTE, 0, 0, 0], DecodeError::UnexpectedEnd),
|
&[U32_BYTE, 0, 0, 0],
|
||||||
(&[U64_BYTE, 0, 0, 0, 0], DecodeError::UnexpectedEnd),
|
DecodeError::UnexpectedEnd { additional: 1 },
|
||||||
(&[U64_BYTE, 0, 0, 0, 0, 0], DecodeError::UnexpectedEnd),
|
),
|
||||||
(&[U64_BYTE, 0, 0, 0, 0, 0, 0], DecodeError::UnexpectedEnd),
|
(&[U64_BYTE], DecodeError::UnexpectedEnd { additional: 8 }),
|
||||||
(&[U64_BYTE, 0, 0, 0, 0, 0, 0, 0], DecodeError::UnexpectedEnd),
|
(&[U64_BYTE, 0], DecodeError::UnexpectedEnd { additional: 7 }),
|
||||||
|
(
|
||||||
|
&[U64_BYTE, 0, 0],
|
||||||
|
DecodeError::UnexpectedEnd { additional: 6 },
|
||||||
|
),
|
||||||
|
(
|
||||||
|
&[U64_BYTE, 0, 0, 0],
|
||||||
|
DecodeError::UnexpectedEnd { additional: 5 },
|
||||||
|
),
|
||||||
|
(
|
||||||
|
&[U64_BYTE, 0, 0, 0, 0],
|
||||||
|
DecodeError::UnexpectedEnd { additional: 4 },
|
||||||
|
),
|
||||||
|
(
|
||||||
|
&[U64_BYTE, 0, 0, 0, 0, 0],
|
||||||
|
DecodeError::UnexpectedEnd { additional: 3 },
|
||||||
|
),
|
||||||
|
(
|
||||||
|
&[U64_BYTE, 0, 0, 0, 0, 0, 0],
|
||||||
|
DecodeError::UnexpectedEnd { additional: 2 },
|
||||||
|
),
|
||||||
|
(
|
||||||
|
&[U64_BYTE, 0, 0, 0, 0, 0, 0, 0],
|
||||||
|
DecodeError::UnexpectedEnd { additional: 1 },
|
||||||
|
),
|
||||||
];
|
];
|
||||||
|
|
||||||
for (slice, expected) in errors {
|
for (slice, expected) in errors {
|
||||||
|
|
@ -564,58 +594,104 @@ fn test_decode_u128() {
|
||||||
}
|
}
|
||||||
|
|
||||||
let errors: &[(&[u8], DecodeError)] = &[
|
let errors: &[(&[u8], DecodeError)] = &[
|
||||||
(&[U16_BYTE], DecodeError::UnexpectedEnd),
|
(&[U16_BYTE], DecodeError::UnexpectedEnd { additional: 2 }),
|
||||||
(&[U16_BYTE, 0], DecodeError::UnexpectedEnd),
|
(&[U16_BYTE, 0], DecodeError::UnexpectedEnd { additional: 1 }),
|
||||||
(&[U32_BYTE], DecodeError::UnexpectedEnd),
|
(&[U32_BYTE], DecodeError::UnexpectedEnd { additional: 4 }),
|
||||||
(&[U32_BYTE, 0], DecodeError::UnexpectedEnd),
|
(&[U32_BYTE, 0], DecodeError::UnexpectedEnd { additional: 3 }),
|
||||||
(&[U32_BYTE, 0, 0], DecodeError::UnexpectedEnd),
|
(
|
||||||
(&[U32_BYTE, 0, 0, 0], DecodeError::UnexpectedEnd),
|
&[U32_BYTE, 0, 0],
|
||||||
(&[U64_BYTE], DecodeError::UnexpectedEnd),
|
DecodeError::UnexpectedEnd { additional: 2 },
|
||||||
(&[U64_BYTE, 0], DecodeError::UnexpectedEnd),
|
),
|
||||||
(&[U64_BYTE, 0, 0], DecodeError::UnexpectedEnd),
|
(
|
||||||
(&[U64_BYTE, 0, 0, 0], DecodeError::UnexpectedEnd),
|
&[U32_BYTE, 0, 0, 0],
|
||||||
(&[U64_BYTE, 0, 0, 0, 0], DecodeError::UnexpectedEnd),
|
DecodeError::UnexpectedEnd { additional: 1 },
|
||||||
(&[U64_BYTE, 0, 0, 0, 0, 0], DecodeError::UnexpectedEnd),
|
),
|
||||||
(&[U64_BYTE, 0, 0, 0, 0, 0, 0], DecodeError::UnexpectedEnd),
|
(&[U64_BYTE], DecodeError::UnexpectedEnd { additional: 8 }),
|
||||||
(&[U64_BYTE, 0, 0, 0, 0, 0, 0, 0], DecodeError::UnexpectedEnd),
|
(&[U64_BYTE, 0], DecodeError::UnexpectedEnd { additional: 7 }),
|
||||||
(&[U128_BYTE], DecodeError::UnexpectedEnd),
|
(
|
||||||
(&[U128_BYTE, 0], DecodeError::UnexpectedEnd),
|
&[U64_BYTE, 0, 0],
|
||||||
(&[U128_BYTE, 0, 0], DecodeError::UnexpectedEnd),
|
DecodeError::UnexpectedEnd { additional: 6 },
|
||||||
(&[U128_BYTE, 0, 0, 0], DecodeError::UnexpectedEnd),
|
),
|
||||||
(&[U128_BYTE, 0, 0, 0, 0], DecodeError::UnexpectedEnd),
|
(
|
||||||
(&[U128_BYTE, 0, 0, 0, 0, 0], DecodeError::UnexpectedEnd),
|
&[U64_BYTE, 0, 0, 0],
|
||||||
(&[U128_BYTE, 0, 0, 0, 0, 0, 0], DecodeError::UnexpectedEnd),
|
DecodeError::UnexpectedEnd { additional: 5 },
|
||||||
|
),
|
||||||
|
(
|
||||||
|
&[U64_BYTE, 0, 0, 0, 0],
|
||||||
|
DecodeError::UnexpectedEnd { additional: 4 },
|
||||||
|
),
|
||||||
|
(
|
||||||
|
&[U64_BYTE, 0, 0, 0, 0, 0],
|
||||||
|
DecodeError::UnexpectedEnd { additional: 3 },
|
||||||
|
),
|
||||||
|
(
|
||||||
|
&[U64_BYTE, 0, 0, 0, 0, 0, 0],
|
||||||
|
DecodeError::UnexpectedEnd { additional: 2 },
|
||||||
|
),
|
||||||
|
(
|
||||||
|
&[U64_BYTE, 0, 0, 0, 0, 0, 0, 0],
|
||||||
|
DecodeError::UnexpectedEnd { additional: 1 },
|
||||||
|
),
|
||||||
|
(&[U128_BYTE], DecodeError::UnexpectedEnd { additional: 16 }),
|
||||||
|
(
|
||||||
|
&[U128_BYTE, 0],
|
||||||
|
DecodeError::UnexpectedEnd { additional: 15 },
|
||||||
|
),
|
||||||
|
(
|
||||||
|
&[U128_BYTE, 0, 0],
|
||||||
|
DecodeError::UnexpectedEnd { additional: 14 },
|
||||||
|
),
|
||||||
|
(
|
||||||
|
&[U128_BYTE, 0, 0, 0],
|
||||||
|
DecodeError::UnexpectedEnd { additional: 13 },
|
||||||
|
),
|
||||||
|
(
|
||||||
|
&[U128_BYTE, 0, 0, 0, 0],
|
||||||
|
DecodeError::UnexpectedEnd { additional: 12 },
|
||||||
|
),
|
||||||
|
(
|
||||||
|
&[U128_BYTE, 0, 0, 0, 0, 0],
|
||||||
|
DecodeError::UnexpectedEnd { additional: 11 },
|
||||||
|
),
|
||||||
|
(
|
||||||
|
&[U128_BYTE, 0, 0, 0, 0, 0, 0],
|
||||||
|
DecodeError::UnexpectedEnd { additional: 10 },
|
||||||
|
),
|
||||||
(
|
(
|
||||||
&[U128_BYTE, 0, 0, 0, 0, 0, 0, 0],
|
&[U128_BYTE, 0, 0, 0, 0, 0, 0, 0],
|
||||||
DecodeError::UnexpectedEnd,
|
DecodeError::UnexpectedEnd { additional: 9 },
|
||||||
),
|
),
|
||||||
(
|
(
|
||||||
&[U128_BYTE, 0, 0, 0, 0, 0, 0, 0, 0],
|
&[U128_BYTE, 0, 0, 0, 0, 0, 0, 0, 0],
|
||||||
DecodeError::UnexpectedEnd,
|
DecodeError::UnexpectedEnd { additional: 8 },
|
||||||
),
|
),
|
||||||
(
|
(
|
||||||
&[U128_BYTE, 0, 0, 0, 0, 0, 0, 0, 0, 0],
|
&[U128_BYTE, 0, 0, 0, 0, 0, 0, 0, 0, 0],
|
||||||
DecodeError::UnexpectedEnd,
|
DecodeError::UnexpectedEnd { additional: 7 },
|
||||||
),
|
),
|
||||||
(
|
(
|
||||||
&[U128_BYTE, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
|
&[U128_BYTE, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
|
||||||
DecodeError::UnexpectedEnd,
|
DecodeError::UnexpectedEnd { additional: 6 },
|
||||||
),
|
),
|
||||||
(
|
(
|
||||||
&[U128_BYTE, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
|
&[U128_BYTE, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
|
||||||
DecodeError::UnexpectedEnd,
|
DecodeError::UnexpectedEnd { additional: 5 },
|
||||||
),
|
),
|
||||||
(
|
(
|
||||||
&[U128_BYTE, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
|
&[U128_BYTE, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
|
||||||
DecodeError::UnexpectedEnd,
|
DecodeError::UnexpectedEnd { additional: 4 },
|
||||||
),
|
),
|
||||||
(
|
(
|
||||||
&[U128_BYTE, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
|
&[U128_BYTE, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
|
||||||
DecodeError::UnexpectedEnd,
|
DecodeError::UnexpectedEnd { additional: 3 },
|
||||||
),
|
),
|
||||||
(
|
(
|
||||||
&[U128_BYTE, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
|
&[U128_BYTE, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
|
||||||
DecodeError::UnexpectedEnd,
|
DecodeError::UnexpectedEnd { additional: 2 },
|
||||||
|
),
|
||||||
|
(
|
||||||
|
&[U128_BYTE, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
|
||||||
|
DecodeError::UnexpectedEnd { additional: 1 },
|
||||||
),
|
),
|
||||||
];
|
];
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue