bencode inspired tight self describing serialization format
Diffstat (limited to 'src/de.rs')
| -rw-r--r-- | src/de.rs | 77 |
1 files changed, 35 insertions, 42 deletions
@@ -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>> |