mirror of https://git.sr.ht/~stygianentity/bincode
Made the varint decode_signed module report the correct errors
This commit is contained in:
parent
02a9b2cb71
commit
2fd2a8d8e2
34
src/error.rs
34
src/error.rs
|
|
@ -105,6 +105,23 @@ pub enum DecodeError {
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl DecodeError {
|
||||||
|
/// If the current error is `InvalidIntegerType`, change the `expected` and
|
||||||
|
/// `found` values from `Ux` to `Ix`. This is needed to have correct error
|
||||||
|
/// reporting in src/varint/decode_signed.rs since this calls
|
||||||
|
/// src/varint/decode_unsigned.rs and needs to correct the `expected` and
|
||||||
|
/// `found` types.
|
||||||
|
pub(crate) fn change_integer_type_to_signed(self) -> DecodeError {
|
||||||
|
match self {
|
||||||
|
Self::InvalidIntegerType { expected, found } => Self::InvalidIntegerType {
|
||||||
|
expected: expected.into_signed(),
|
||||||
|
found: found.into_signed(),
|
||||||
|
},
|
||||||
|
other => other,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// Integer types. Used by [DecodeError]. These types have no purpose other than being shown in errors.
|
/// Integer types. Used by [DecodeError]. These types have no purpose other than being shown in errors.
|
||||||
#[non_exhaustive]
|
#[non_exhaustive]
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
|
|
@ -124,3 +141,20 @@ pub enum IntegerType {
|
||||||
I128,
|
I128,
|
||||||
Isize,
|
Isize,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl IntegerType {
|
||||||
|
/// Change the `Ux` value to the associated `Ix` value.
|
||||||
|
/// Returns the old value if `self` is already `Ix`.
|
||||||
|
pub(crate) fn into_signed(self) -> Self {
|
||||||
|
match self {
|
||||||
|
Self::U8 => Self::I8,
|
||||||
|
Self::U16 => Self::I16,
|
||||||
|
Self::U32 => Self::I32,
|
||||||
|
Self::U64 => Self::I64,
|
||||||
|
Self::U128 => Self::I128,
|
||||||
|
Self::Usize => Self::Isize,
|
||||||
|
|
||||||
|
other => other,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,12 @@
|
||||||
use crate::{config::Endian, de::read::Reader, error::DecodeError};
|
use crate::{
|
||||||
|
config::Endian,
|
||||||
|
de::read::Reader,
|
||||||
|
error::{DecodeError, IntegerType},
|
||||||
|
};
|
||||||
|
|
||||||
pub fn varint_decode_i16<R: Reader>(read: &mut R, endian: Endian) -> Result<i16, DecodeError> {
|
pub fn varint_decode_i16<R: Reader>(read: &mut R, endian: Endian) -> Result<i16, DecodeError> {
|
||||||
let n = super::varint_decode_u16(read, endian)?;
|
let n = super::varint_decode_u16(read, endian)
|
||||||
|
.map_err(DecodeError::change_integer_type_to_signed)?;
|
||||||
Ok(if n % 2 == 0 {
|
Ok(if n % 2 == 0 {
|
||||||
// positive number
|
// positive number
|
||||||
(n / 2) as _
|
(n / 2) as _
|
||||||
|
|
@ -17,7 +22,8 @@ pub fn varint_decode_i16<R: Reader>(read: &mut R, endian: Endian) -> Result<i16,
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn varint_decode_i32<R: Reader>(read: &mut R, endian: Endian) -> Result<i32, DecodeError> {
|
pub fn varint_decode_i32<R: Reader>(read: &mut R, endian: Endian) -> Result<i32, DecodeError> {
|
||||||
let n = super::varint_decode_u32(read, endian)?;
|
let n = super::varint_decode_u32(read, endian)
|
||||||
|
.map_err(DecodeError::change_integer_type_to_signed)?;
|
||||||
Ok(if n % 2 == 0 {
|
Ok(if n % 2 == 0 {
|
||||||
// positive number
|
// positive number
|
||||||
(n / 2) as _
|
(n / 2) as _
|
||||||
|
|
@ -33,7 +39,8 @@ pub fn varint_decode_i32<R: Reader>(read: &mut R, endian: Endian) -> Result<i32,
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn varint_decode_i64<R: Reader>(read: &mut R, endian: Endian) -> Result<i64, DecodeError> {
|
pub fn varint_decode_i64<R: Reader>(read: &mut R, endian: Endian) -> Result<i64, DecodeError> {
|
||||||
let n = super::varint_decode_u64(read, endian)?;
|
let n = super::varint_decode_u64(read, endian)
|
||||||
|
.map_err(DecodeError::change_integer_type_to_signed)?;
|
||||||
Ok(if n % 2 == 0 {
|
Ok(if n % 2 == 0 {
|
||||||
// positive number
|
// positive number
|
||||||
(n / 2) as _
|
(n / 2) as _
|
||||||
|
|
@ -49,7 +56,8 @@ pub fn varint_decode_i64<R: Reader>(read: &mut R, endian: Endian) -> Result<i64,
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn varint_decode_i128<R: Reader>(read: &mut R, endian: Endian) -> Result<i128, DecodeError> {
|
pub fn varint_decode_i128<R: Reader>(read: &mut R, endian: Endian) -> Result<i128, DecodeError> {
|
||||||
let n = super::varint_decode_u128(read, endian)?;
|
let n = super::varint_decode_u128(read, endian)
|
||||||
|
.map_err(DecodeError::change_integer_type_to_signed)?;
|
||||||
Ok(if n % 2 == 0 {
|
Ok(if n % 2 == 0 {
|
||||||
// positive number
|
// positive number
|
||||||
(n / 2) as _
|
(n / 2) as _
|
||||||
|
|
@ -65,5 +73,14 @@ pub fn varint_decode_i128<R: Reader>(read: &mut R, endian: Endian) -> Result<i12
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn varint_decode_isize<R: Reader>(read: &mut R, endian: Endian) -> Result<isize, DecodeError> {
|
pub fn varint_decode_isize<R: Reader>(read: &mut R, endian: Endian) -> Result<isize, DecodeError> {
|
||||||
varint_decode_i64(read, endian).map(|v| v as isize)
|
match varint_decode_i64(read, endian) {
|
||||||
|
Ok(val) => Ok(val as isize),
|
||||||
|
Err(DecodeError::InvalidIntegerType { found, .. }) => {
|
||||||
|
Err(DecodeError::InvalidIntegerType {
|
||||||
|
expected: IntegerType::Isize,
|
||||||
|
found: found.into_signed(),
|
||||||
|
})
|
||||||
|
}
|
||||||
|
Err(e) => Err(e),
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue