bencode inspired tight self describing serialization format
Diffstat (limited to 'src/de.rs')
-rw-r--r--src/de.rs77
1 files changed, 35 insertions, 42 deletions
diff --git a/src/de.rs b/src/de.rs
index e1f29d2..8adb30d 100644
--- a/src/de.rs
+++ b/src/de.rs
@@ -13,19 +13,8 @@ pub fn from_bytes<'a, T: Deserialize<'a>>(x: &'a [u8]) -> Result<T> {
let mut d = Deserializer { r: x };
T::deserialize(&mut d)
}
-#[test]
-fn de_leb128() {
- use atools::prelude::*;
- dbg!(
- Deserializer {
- r: &[0x80; 18].join(04)
- }
- .leb128()
- .unwrap()
- );
-}
-impl<'de> Deserializer<'de> {
+impl Deserializer<'_> {
pub fn leb128(&mut self) -> Result<u128> {
let mut res = 0u128;
let mut shift = 0;
@@ -35,7 +24,7 @@ impl<'de> Deserializer<'de> {
if shift == 18 && b > 0b11 {
return Err(Error::Overflow);
}
- res |= ((b & 127) as u128)
+ res |= u128::from(b & 127)
.checked_shl(shift * 7)
.ok_or(Error::Overflow)?;
shift += 1;
@@ -55,7 +44,7 @@ impl<'de> Deserializer<'de> {
&& let 0..=1 | 126..=127 = b
{}
- res |= ((b & 127) as u128)
+ res |= u128::from(b & 127)
.checked_shl(shift * 7)
.ok_or(Error::Overflow)?;
shift += 1;
@@ -134,7 +123,7 @@ impl<'de> serde::Deserializer<'de> for &mut Deserializer<'de> {
x if T::UVariant == x => {
self.tag(T::UVariant)?;
self.tag(T::Uint)?;
- visitor.visit_u32(self.leb128()? as _)
+ visitor.visit_u32(self.leb128()?.try_into()?)
}
x if T::TVariant == x => {
self.tag(T::TVariant)?;
@@ -170,7 +159,7 @@ impl<'de> serde::Deserializer<'de> for &mut Deserializer<'de> {
V: Visitor<'de>,
{
self.tag(T::Int)?;
- visitor.visit_i8(self.sleb128()? as _)
+ visitor.visit_i8(self.sleb128()?.try_into()?)
}
fn deserialize_i16<V>(self, visitor: V) -> Result<V::Value>
@@ -178,7 +167,7 @@ impl<'de> serde::Deserializer<'de> for &mut Deserializer<'de> {
V: Visitor<'de>,
{
self.tag(T::Int)?;
- visitor.visit_i16(self.sleb128()? as _)
+ visitor.visit_i16(self.sleb128()?.try_into()?)
}
fn deserialize_i32<V>(self, visitor: V) -> Result<V::Value>
@@ -186,7 +175,7 @@ impl<'de> serde::Deserializer<'de> for &mut Deserializer<'de> {
V: Visitor<'de>,
{
self.tag(T::Int)?;
- visitor.visit_i32(self.sleb128()? as _)
+ visitor.visit_i32(self.sleb128()?.try_into()?)
}
fn deserialize_i64<V>(self, visitor: V) -> Result<V::Value>
@@ -194,7 +183,7 @@ impl<'de> serde::Deserializer<'de> for &mut Deserializer<'de> {
V: Visitor<'de>,
{
self.tag(T::Int)?;
- visitor.visit_i64(self.sleb128()? as _)
+ visitor.visit_i64(self.sleb128()?.try_into()?)
}
fn deserialize_i128<V>(self, visitor: V) -> Result<V::Value>
where
@@ -210,7 +199,7 @@ impl<'de> serde::Deserializer<'de> for &mut Deserializer<'de> {
{
self.tag(T::Uint)?;
let v = self.leb128()?;
- visitor.visit_u8(v as _)
+ visitor.visit_u8(v.try_into()?)
}
fn deserialize_u16<V>(self, visitor: V) -> Result<V::Value>
@@ -219,7 +208,7 @@ impl<'de> serde::Deserializer<'de> for &mut Deserializer<'de> {
{
self.tag(T::Uint)?;
let v = self.leb128()?;
- visitor.visit_u16(v as _)
+ visitor.visit_u16(v.try_into()?)
}
fn deserialize_u32<V>(self, visitor: V) -> Result<V::Value>
@@ -228,7 +217,7 @@ impl<'de> serde::Deserializer<'de> for &mut Deserializer<'de> {
{
self.tag(T::Uint)?;
let v = self.leb128()?;
- visitor.visit_u32(v as _)
+ visitor.visit_u32(v.try_into()?)
}
fn deserialize_u64<V>(self, visitor: V) -> Result<V::Value>
@@ -237,7 +226,7 @@ impl<'de> serde::Deserializer<'de> for &mut Deserializer<'de> {
{
self.tag(T::Uint)?;
let v = self.leb128()?;
- visitor.visit_u64(v as _)
+ visitor.visit_u64(v.try_into()?)
}
fn deserialize_u128<V>(self, visitor: V) -> Result<V::Value>
@@ -271,7 +260,7 @@ impl<'de> serde::Deserializer<'de> for &mut Deserializer<'de> {
{
self.tag(T::Uint)?;
let v = self.leb128()?;
- visitor.visit_char(char::from_u32(v as _).ok_or(Error::NotChar(v as u32))?)
+ visitor.visit_char(char::from_u32(v.try_into()?).ok_or(Error::NotChar(v.try_into()?))?)
}
fn deserialize_str<V>(self, visitor: V) -> Result<V::Value>
@@ -288,7 +277,7 @@ impl<'de> serde::Deserializer<'de> for &mut Deserializer<'de> {
self.tag(T::String)?;
let len = self.leb128()? as usize;
let v = visitor
- .visit_borrowed_str(str::from_utf8(&self.r.get(..len).ok_or(Error::OOB)?)?);
+ .visit_borrowed_str(str::from_utf8(self.r.get(..len).ok_or(Error::OOB)?)?);
self.r = self.r.get(len..).ok_or(Error::OOB)?;
v
}
@@ -315,8 +304,8 @@ impl<'de> serde::Deserializer<'de> for &mut Deserializer<'de> {
{
self.tag(T::String)?;
let len = self.leb128()? as usize;
- let v = visitor.visit_borrowed_bytes(&self.r.get(..len).ok_or(Error::OOB)?);
- self.r = &self.r.get(len..).ok_or(Error::OOB)?;
+ let v = visitor.visit_borrowed_bytes(self.r.get(..len).ok_or(Error::OOB)?);
+ self.r = self.r.get(len..).ok_or(Error::OOB)?;
v
}
@@ -384,13 +373,13 @@ impl<'de> serde::Deserializer<'de> for &mut Deserializer<'de> {
self.deserialize_seq(visitor)
}
- fn deserialize_map<V>(self, _visitor: V) -> Result<V::Value>
+ fn deserialize_map<V>(self, visitor: V) -> Result<V::Value>
where
V: Visitor<'de>,
{
self.tag(T::Map)?;
let len = self.leb128()? as usize;
- _visitor.visit_map(MapAccess { de: self, len })
+ visitor.visit_map(MapAccess { de: self, len })
}
fn deserialize_struct<V>(
@@ -429,11 +418,11 @@ impl<'de> serde::Deserializer<'de> for &mut Deserializer<'de> {
match self.t()? {
x if T::String == x => {
let len = self.leb128()? as usize;
- let v = str::from_utf8(&self.r.get(..len).ok_or(Error::OOB)?)?;
+ let v = str::from_utf8(self.r.get(..len).ok_or(Error::OOB)?)?;
self.r = self.r.get(len..).ok_or(Error::OOB)?;
- visitor.visit_borrowed_str(&v)
+ visitor.visit_borrowed_str(v)
}
- x if T::Uint == x => visitor.visit_u32(self.leb128()? as _),
+ x if T::Uint == x => visitor.visit_u32(self.leb128()?.try_into()?),
x => Err(Error::Expected {
expected: T::String,
found: x,
@@ -460,7 +449,7 @@ impl<'a, 'de> SeqAccess<'a, 'de> {
}
}
-impl<'a, 'de> de::SeqAccess<'de> for SeqAccess<'a, 'de> {
+impl<'de> de::SeqAccess<'de> for SeqAccess<'_, 'de> {
type Error = Error;
fn next_element_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>>
@@ -487,7 +476,7 @@ impl<'a, 'de> EnumAccess<'a, 'de> {
}
}
-impl<'a, 'de> de::EnumAccess<'de> for EnumAccess<'a, 'de> {
+impl<'de> de::EnumAccess<'de> for EnumAccess<'_, 'de> {
type Error = Error;
type Variant = Self;
@@ -500,7 +489,7 @@ impl<'a, 'de> de::EnumAccess<'de> for EnumAccess<'a, 'de> {
}
}
-impl<'a, 'de> de::VariantAccess<'de> for EnumAccess<'a, 'de> {
+impl<'de> de::VariantAccess<'de> for EnumAccess<'_, 'de> {
type Error = Error;
fn unit_variant(self) -> Result<()> {
@@ -518,21 +507,25 @@ impl<'a, 'de> de::VariantAccess<'de> for EnumAccess<'a, 'de> {
where
V: Visitor<'de>,
{
- let x = self.de.leb128()?;
- assert_eq!(x, len as u128);
+ let x = self.de.leb128()? as usize;
+ if x != len {
+ return Err(Error::IncoherentLen(x, len));
+ }
visitor.visit_seq(SeqAccess::new(self.de, len))
}
- fn struct_variant<V>(self, _fields: &'static [&'static str], visitor: V) -> Result<V::Value>
+ fn struct_variant<V>(self, fields: &'static [&'static str], visitor: V) -> Result<V::Value>
where
V: Visitor<'de>,
{
- let x = self.de.leb128()?;
- assert_eq!(x, _fields.len() as u128);
+ let x = self.de.leb128()? as usize;
+ if x != fields.len() {
+ return Err(Error::IncoherentLen(x, fields.len()));
+ }
// T::SVariant data follows
visitor.visit_map(MapAccess {
de: self.de,
- len: _fields.len(),
+ len: fields.len(),
})
}
}
@@ -541,7 +534,7 @@ struct MapAccess<'a, 'de> {
de: &'a mut Deserializer<'de>,
len: usize,
}
-impl<'a, 'de> de::MapAccess<'de> for MapAccess<'a, 'de> {
+impl<'de> de::MapAccess<'de> for MapAccess<'_, 'de> {
type Error = Error;
fn next_key_seed<K>(&mut self, seed: K) -> Result<Option<K::Value>>