|
@@ -92,30 +92,37 @@ impl<'de, T: Read + ?Sized> Deserializer<'de, T> {
|
|
Ok(())
|
|
Ok(())
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ fn read_array<const N: usize>(&mut self) -> Result<[u8; N]> {
|
|
|
|
+ let mut array = [0u8; N];
|
|
|
|
+ self.read_exact(array.as_mut_slice())?;
|
|
|
|
+ Ok(array)
|
|
|
|
+ }
|
|
|
|
+
|
|
fn read_u8(&mut self) -> Result<u8> {
|
|
fn read_u8(&mut self) -> Result<u8> {
|
|
- let mut buf = [0u8; 1];
|
|
|
|
- self.read_exact(&mut buf)?;
|
|
|
|
|
|
+ let buf = self.read_array::<1>()?;
|
|
Ok(buf[0])
|
|
Ok(buf[0])
|
|
}
|
|
}
|
|
|
|
|
|
fn read_u16(&mut self) -> Result<u16> {
|
|
fn read_u16(&mut self) -> Result<u16> {
|
|
- let mut buf = [0u8; 2];
|
|
|
|
- self.read_exact(&mut buf)?;
|
|
|
|
|
|
+ let buf = self.read_array()?;
|
|
Ok(u16::from_le_bytes(buf))
|
|
Ok(u16::from_le_bytes(buf))
|
|
}
|
|
}
|
|
|
|
|
|
fn read_u32(&mut self) -> Result<u32> {
|
|
fn read_u32(&mut self) -> Result<u32> {
|
|
- let mut buf = [0u8; 4];
|
|
|
|
- self.read_exact(&mut buf)?;
|
|
|
|
|
|
+ let buf = self.read_array()?;
|
|
Ok(u32::from_le_bytes(buf))
|
|
Ok(u32::from_le_bytes(buf))
|
|
}
|
|
}
|
|
|
|
|
|
fn read_u64(&mut self) -> Result<u64> {
|
|
fn read_u64(&mut self) -> Result<u64> {
|
|
- let mut buf = [0u8; 8];
|
|
|
|
- self.read_exact(&mut buf)?;
|
|
|
|
|
|
+ let buf = self.read_array()?;
|
|
Ok(u64::from_le_bytes(buf))
|
|
Ok(u64::from_le_bytes(buf))
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ fn read_u128(&mut self) -> Result<u128> {
|
|
|
|
+ let buf = self.read_array()?;
|
|
|
|
+ Ok(u128::from_le_bytes(buf))
|
|
|
|
+ }
|
|
|
|
+
|
|
fn read_i8(&mut self) -> Result<i8> {
|
|
fn read_i8(&mut self) -> Result<i8> {
|
|
let value = self.read_u8()?;
|
|
let value = self.read_u8()?;
|
|
Ok(value as i8)
|
|
Ok(value as i8)
|
|
@@ -131,6 +138,16 @@ impl<'de, T: Read + ?Sized> Deserializer<'de, T> {
|
|
Ok(value as i32)
|
|
Ok(value as i32)
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ fn read_i64(&mut self) -> Result<i64> {
|
|
|
|
+ let value = self.read_u64()?;
|
|
|
|
+ Ok(value as i64)
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ fn read_i128(&mut self) -> Result<i128> {
|
|
|
|
+ let value = self.read_u128()?;
|
|
|
|
+ Ok(value as i128)
|
|
|
|
+ }
|
|
|
|
+
|
|
fn read_bool(&mut self) -> Result<bool> {
|
|
fn read_bool(&mut self) -> Result<bool> {
|
|
let byte = self.read_u8()?;
|
|
let byte = self.read_u8()?;
|
|
Ok(byte > 0)
|
|
Ok(byte > 0)
|
|
@@ -180,9 +197,13 @@ impl<'de, 'a, T: Read> de::Deserializer<'de> for &'a mut Deserializer<'de, T> {
|
|
}
|
|
}
|
|
|
|
|
|
fn deserialize_i64<V: Visitor<'de>>(self, visitor: V) -> Result<V::Value> {
|
|
fn deserialize_i64<V: Visitor<'de>>(self, visitor: V) -> Result<V::Value> {
|
|
- let unsigned = self.read_u64()?;
|
|
|
|
- let signed = unsigned as i64;
|
|
|
|
- visitor.visit_i64(signed)
|
|
|
|
|
|
+ let value = self.read_i64()?;
|
|
|
|
+ visitor.visit_i64(value)
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ fn deserialize_i128<V: Visitor<'de>>(self, visitor: V) -> Result<V::Value> {
|
|
|
|
+ let value = self.read_i128()?;
|
|
|
|
+ visitor.visit_i128(value)
|
|
}
|
|
}
|
|
|
|
|
|
fn deserialize_u8<V: Visitor<'de>>(self, visitor: V) -> Result<V::Value> {
|
|
fn deserialize_u8<V: Visitor<'de>>(self, visitor: V) -> Result<V::Value> {
|
|
@@ -205,6 +226,11 @@ impl<'de, 'a, T: Read> de::Deserializer<'de> for &'a mut Deserializer<'de, T> {
|
|
visitor.visit_u64(value)
|
|
visitor.visit_u64(value)
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ fn deserialize_u128<V: Visitor<'de>>(self, visitor: V) -> Result<V::Value> {
|
|
|
|
+ let value = self.read_u128()?;
|
|
|
|
+ visitor.visit_u128(value)
|
|
|
|
+ }
|
|
|
|
+
|
|
fn deserialize_f32<V: Visitor<'de>>(self, visitor: V) -> Result<V::Value> {
|
|
fn deserialize_f32<V: Visitor<'de>>(self, visitor: V) -> Result<V::Value> {
|
|
let mut buf = [0u8; 4];
|
|
let mut buf = [0u8; 4];
|
|
self.read_exact(&mut buf)?;
|
|
self.read_exact(&mut buf)?;
|
|
@@ -493,6 +519,17 @@ mod test {
|
|
Ok(())
|
|
Ok(())
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ #[test]
|
|
|
|
+ fn deserialize_i128() -> Result<()> {
|
|
|
|
+ let vec: Vec<u8> = vec![
|
|
|
|
+ 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
|
|
|
+ 0xFF, 0xFF,
|
|
|
|
+ ];
|
|
|
|
+ let result = from_vec(&vec);
|
|
|
|
+ assert_eq!(-2i128, result?);
|
|
|
|
+ Ok(())
|
|
|
|
+ }
|
|
|
|
+
|
|
#[test]
|
|
#[test]
|
|
fn deserialize_u8() -> Result<()> {
|
|
fn deserialize_u8() -> Result<()> {
|
|
let vec: Vec<u8> = vec![0xFF];
|
|
let vec: Vec<u8> = vec![0xFF];
|
|
@@ -525,6 +562,17 @@ mod test {
|
|
Ok(())
|
|
Ok(())
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ #[test]
|
|
|
|
+ fn deserialize_u128() -> Result<()> {
|
|
|
|
+ let vec: Vec<u8> = vec![
|
|
|
|
+ 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
|
|
|
+ 0xFF, 0xFF,
|
|
|
|
+ ];
|
|
|
|
+ let result = from_vec(&vec);
|
|
|
|
+ assert_eq!(0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEu128, result?);
|
|
|
|
+ Ok(())
|
|
|
|
+ }
|
|
|
|
+
|
|
#[test]
|
|
#[test]
|
|
fn deserialize_f32() -> Result<()> {
|
|
fn deserialize_f32() -> Result<()> {
|
|
let vec: Vec<u8> = vec![0x00, 0x00, 0x20, 0x3E];
|
|
let vec: Vec<u8> = vec![0x00, 0x00, 0x20, 0x3E];
|