use bitvec::{prelude as bv, slice::BitSlice, view::BitView};
use serde::{
de::{EnumAccess, IntoDeserializer, MapAccess, SeqAccess, VariantAccess},
Deserialize, Deserializer,
};
use super::{error::Error, serializer::Delimiter};
#[derive(Debug)]
struct CustomDeserializer<'de> {
data: &'de bv::BitSlice<u8, bv::Lsb0>,
}
pub fn from_bytes<'de, T>(bytes: &'de [u8]) -> Result<T, Error>
where
T: Deserialize<'de>,
{
let mut deserializer = CustomDeserializer {
data: bytes.view_bits(),
};
let deserialized = T::deserialize(&mut deserializer)?;
Ok(deserialized)
}
impl<'de> CustomDeserializer<'de> {
fn _peek_n_bits(&self, size: usize) -> Result<&BitSlice<u8>, Error> {
let len = self.data.len();
if size > len {
return Err(Error::NLargerThanLength(size, self.data.len()));
}
self.data.get(..size).ok_or(Error::NoByte)
}
pub fn peek_byte(&self) -> Result<u8, Error> {
let bits = self._peek_n_bits(8)?;
let mut byte = 0u8;
for (i, bit) in bits.iter().enumerate() {
if *bit {
byte |= 1 << i;
}
}
Ok(byte)
}
pub fn peek_token(&self, token: Delimiter) -> Result<bool, Error> {
let bits = match token {
Delimiter::String => self._peek_n_bits(8)?,
Delimiter::Byte => self._peek_n_bits(8)?,
Delimiter::Map => self._peek_n_bits(8)?,
_ => self._peek_n_bits(3)?,
};
let mut byte = 0u8;
for (i, bit) in bits.iter().enumerate() {
if *bit {
byte |= 1 << i;
}
}
if byte == token as u8 {
Ok(true)
} else {
Ok(false)
}
}
pub fn eat_bit(&mut self) -> Result<bool, Error> {
let bit = *self._peek_n_bits(1)?.get(0).ok_or(Error::NoBit)?;
self.data = &self.data[1..];
Ok(bit)
}
pub fn eat_byte(&mut self) -> Result<u8, Error> {
let byte = self.peek_byte()?;
self.data = &self.data[8..];
Ok(byte)
}
pub fn eat_bytes(&mut self, n: usize) -> Result<Vec<u8>, Error> {
let bits = &self.data[..n * 8];
let mut bytes = Vec::new();
self.data = &self.data[n * 8..];
for i in 0..n {
let mut byte = 0u8;
for (j, bit) in bits[i * 8..(i + 1) * 8].iter().enumerate() {
if *bit {
byte |= 1 << j;
}
}
bytes.push(byte);
}
Ok(bytes)
}
pub fn eat_token(&mut self, token: Delimiter) -> Result<(), Error> {
let bits_to_munch = match token {
Delimiter::String => 8,
Delimiter::Byte => 8,
Delimiter::Map => 8,
_ => 3,
};
if self.data.len() < bits_to_munch {
return Err(Error::UnexpectedEOF);
}
self.data = &self.data[bits_to_munch..];
Ok(())
}
pub fn parse_bool(&mut self) -> Result<bool, Error> {
self.eat_bit()
}
pub fn parse_unsigned<T>(&mut self) -> Result<T, Error>
where
T: TryFrom<u8> + TryFrom<u16> + TryFrom<u32> + TryFrom<u64>,
{
let length = std::mem::size_of::<T>();
if self.data.len() < length {
return Err(Error::UnexpectedEOF);
}
match length {
1 => {
let byte = self.eat_byte()?;
u8::from_le_bytes([byte])
.try_into()
.map_err(|_| Error::ConversionError)
}
2 => {
let bytes = self.eat_bytes(length)?;
u16::from_le_bytes([bytes[0], bytes[1]])
.try_into()
.map_err(|_| Error::ConversionError)
}
4 => {
let bytes = self.eat_bytes(length)?;
u32::from_le_bytes([bytes[0], bytes[1], bytes[2], bytes[3]])
.try_into()
.map_err(|_| Error::ConversionError)
}
8 => {
let bytes = self.eat_bytes(length)?;
u64::from_le_bytes([
bytes[0], bytes[1], bytes[2], bytes[3], bytes[4], bytes[5], bytes[6], bytes[7],
])
.try_into()
.map_err(|_| Error::ConversionError)
}
_ => Err(Error::InvalidTypeSize),
}
}
pub fn parse_signed<T>(&mut self) -> Result<T, Error>
where
T: TryFrom<i8> + TryFrom<i16> + TryFrom<i32> + TryFrom<i64>,
{
let length = std::mem::size_of::<T>();
if self.data.len() < length {
return Err(Error::UnexpectedEOF);
}
match length {
1 => {
let byte = self.eat_byte()?;
i8::from_le_bytes([byte])
.try_into()
.map_err(|_| Error::ConversionError)
}
2 => {
let bytes = self.eat_bytes(length)?;
i16::from_le_bytes([bytes[0], bytes[1]])
.try_into()
.map_err(|_| Error::ConversionError)
}
4 => {
let bytes = self.eat_bytes(length)?;
i32::from_le_bytes([bytes[0], bytes[1], bytes[2], bytes[3]])
.try_into()
.map_err(|_| Error::ConversionError)
}
8 => {
let bytes = self.eat_bytes(length)?;
i64::from_le_bytes([
bytes[0], bytes[1], bytes[2], bytes[3], bytes[4], bytes[5], bytes[6], bytes[7],
])
.try_into()
.map_err(|_| Error::ConversionError)
}
_ => Err(Error::InvalidTypeSize),
}
}
pub fn parse_f32(&mut self) -> Result<f32, Error> {
let bytes = self.eat_bytes(4)?;
Ok(f32::from_le_bytes([bytes[0], bytes[1], bytes[2], bytes[3]]))
}
pub fn parse_f64(&mut self) -> Result<f64, Error> {
let bytes = self.eat_bytes(8)?;
Ok(f64::from_le_bytes([
bytes[0], bytes[1], bytes[2], bytes[3], bytes[4], bytes[5], bytes[6], bytes[7],
]))
}
pub fn parse_char(&mut self) -> Result<char, Error> {
let value = self.parse_unsigned::<u32>()?;
Ok(std::char::from_u32(value).unwrap())
}
pub fn parse_str(&mut self, bytes: &mut Vec<u8>) -> Result<String, Error> {
'byteloop: loop {
let byte = self.eat_byte()?;
bytes.push(byte);
if self.peek_token(Delimiter::String)? {
self.eat_token(Delimiter::String)?;
break 'byteloop;
}
}
String::from_utf8(bytes.clone()).map_err(|_| Error::ConversionError)
}
pub fn parse_bytes(&mut self, bytes: &mut Vec<u8>) -> Result<(), Error> {
loop {
if self.peek_token(Delimiter::Byte)? {
self.eat_token(Delimiter::Byte)?;
break;
}
let byte = self.eat_byte()?;
bytes.push(byte);
}
Ok(())
}
}
impl<'de, 'a> Deserializer<'de> for &'a mut CustomDeserializer<'de> {
type Error = Error;
fn deserialize_any<V>(self, _visitor: V) -> Result<V::Value, Self::Error>
where
V: serde::de::Visitor<'de>,
{
Err(Error::UnsupportedCall("deserialize_any".to_string()))
}
fn deserialize_bool<V>(self, visitor: V) -> Result<V::Value, Self::Error>
where
V: serde::de::Visitor<'de>,
{
visitor.visit_bool(self.parse_bool()?)
}
fn deserialize_i8<V>(self, visitor: V) -> Result<V::Value, Self::Error>
where
V: serde::de::Visitor<'de>,
{
visitor.visit_i8(self.parse_signed::<i8>()?)
}
fn deserialize_i16<V>(self, visitor: V) -> Result<V::Value, Self::Error>
where
V: serde::de::Visitor<'de>,
{
visitor.visit_i16(self.parse_signed::<i16>()?)
}
fn deserialize_i32<V>(self, visitor: V) -> Result<V::Value, Self::Error>
where
V: serde::de::Visitor<'de>,
{
visitor.visit_i32(self.parse_signed::<i32>()?)
}
fn deserialize_i64<V>(self, visitor: V) -> Result<V::Value, Self::Error>
where
V: serde::de::Visitor<'de>,
{
visitor.visit_i64(self.parse_signed::<i64>()?)
}
fn deserialize_u8<V>(self, visitor: V) -> Result<V::Value, Self::Error>
where
V: serde::de::Visitor<'de>,
{
visitor.visit_u8(self.parse_unsigned::<u8>()?)
}
fn deserialize_u16<V>(self, visitor: V) -> Result<V::Value, Self::Error>
where
V: serde::de::Visitor<'de>,
{
visitor.visit_u16(self.parse_unsigned::<u16>()?)
}
fn deserialize_u32<V>(self, visitor: V) -> Result<V::Value, Self::Error>
where
V: serde::de::Visitor<'de>,
{
visitor.visit_u32(self.parse_unsigned::<u32>()?)
}
fn deserialize_u64<V>(self, visitor: V) -> Result<V::Value, Self::Error>
where
V: serde::de::Visitor<'de>,
{
visitor.visit_u64(self.parse_unsigned::<u64>()?)
}
fn deserialize_f32<V>(self, visitor: V) -> Result<V::Value, Self::Error>
where
V: serde::de::Visitor<'de>,
{
visitor.visit_f32(self.parse_f32()?)
}
fn deserialize_f64<V>(self, visitor: V) -> Result<V::Value, Self::Error>
where
V: serde::de::Visitor<'de>,
{
visitor.visit_f64(self.parse_f64()?)
}
fn deserialize_char<V>(self, visitor: V) -> Result<V::Value, Self::Error>
where
V: serde::de::Visitor<'de>,
{
visitor.visit_char(self.parse_char()?)
}
fn deserialize_str<V>(self, visitor: V) -> Result<V::Value, Self::Error>
where
V: serde::de::Visitor<'de>,
{
let mut bytes = Vec::new();
visitor.visit_str(self.parse_str(&mut bytes)?.as_str())
}
fn deserialize_string<V>(self, visitor: V) -> Result<V::Value, Self::Error>
where
V: serde::de::Visitor<'de>,
{
let mut bytes = Vec::new();
visitor.visit_string(self.parse_str(&mut bytes)?.to_string())
}
fn deserialize_bytes<V>(self, visitor: V) -> Result<V::Value, Self::Error>
where
V: serde::de::Visitor<'de>,
{
let mut bytes = Vec::new();
self.parse_bytes(&mut bytes)?;
visitor.visit_bytes(&bytes)
}
fn deserialize_byte_buf<V>(self, visitor: V) -> Result<V::Value, Self::Error>
where
V: serde::de::Visitor<'de>,
{
let mut bytes = Vec::new();
self.parse_bytes(&mut bytes)?;
visitor.visit_byte_buf(bytes)
}
fn deserialize_option<V>(self, visitor: V) -> Result<V::Value, Self::Error>
where
V: serde::de::Visitor<'de>,
{
match self.peek_token(Delimiter::Unit)? {
true => {
self.eat_token(Delimiter::Unit)?;
visitor.visit_none()
}
false => visitor.visit_some(self),
}
}
fn deserialize_unit<V>(self, visitor: V) -> Result<V::Value, Self::Error>
where
V: serde::de::Visitor<'de>,
{
match self.peek_token(Delimiter::Unit)? {
true => {
self.eat_token(Delimiter::Unit)?;
visitor.visit_unit()
}
_ => Err(Error::ExpectedDelimiter(Delimiter::Unit)),
}
}
fn deserialize_unit_struct<V>(
self,
_name: &'static str,
visitor: V,
) -> Result<V::Value, Self::Error>
where
V: serde::de::Visitor<'de>,
{
self.deserialize_unit(visitor)
}
fn deserialize_newtype_struct<V>(
self,
_name: &'static str,
visitor: V,
) -> Result<V::Value, Self::Error>
where
V: serde::de::Visitor<'de>,
{
visitor.visit_newtype_struct(self)
}
fn deserialize_tuple_struct<V>(
self,
_name: &'static str,
_len: usize,
visitor: V,
) -> Result<V::Value, Self::Error>
where
V: serde::de::Visitor<'de>,
{
self.deserialize_seq(visitor)
}
fn deserialize_enum<V>(
self,
_name: &'static str,
_variants: &'static [&'static str],
visitor: V,
) -> Result<V::Value, Self::Error>
where
V: serde::de::Visitor<'de>,
{
visitor.visit_enum(self)
}
fn deserialize_seq<V>(self, visitor: V) -> Result<V::Value, Self::Error>
where
V: serde::de::Visitor<'de>,
{
match self.peek_token(Delimiter::Seq)? {
true => {
self.eat_token(Delimiter::Seq)?;
let value = visitor.visit_seq(SequenceDeserializer::new(self))?;
if !self.peek_token(Delimiter::Seq)? {
return Err(Error::ExpectedDelimiter(Delimiter::Seq));
}
self.eat_token(Delimiter::Seq)?;
Ok(value)
}
false => Err(Error::ExpectedDelimiter(Delimiter::Seq)),
}
}
fn deserialize_map<V>(self, visitor: V) -> Result<V::Value, Self::Error>
where
V: serde::de::Visitor<'de>,
{
let value = visitor.visit_map(MapDeserializer::new(self))?;
if !self.peek_token(Delimiter::Map)? {
return Err(Error::ExpectedDelimiter(Delimiter::Map));
}
self.eat_token(Delimiter::Map)?;
Ok(value)
}
fn deserialize_tuple<V>(self, _len: usize, visitor: V) -> Result<V::Value, Self::Error>
where
V: serde::de::Visitor<'de>,
{
self.deserialize_seq(visitor)
}
fn deserialize_struct<V>(
self,
_name: &'static str,
_fields: &'static [&'static str],
visitor: V,
) -> Result<V::Value, Self::Error>
where
V: serde::de::Visitor<'de>,
{
self.deserialize_map(visitor)
}
fn deserialize_identifier<V>(self, visitor: V) -> Result<V::Value, Self::Error>
where
V: serde::de::Visitor<'de>,
{
self.deserialize_str(visitor)
}
fn deserialize_ignored_any<V>(self, _visitor: V) -> Result<V::Value, Self::Error>
where
V: serde::de::Visitor<'de>,
{
Err(Error::UnsupportedCall(
"deserialize_ignored_any".to_string(),
))
}
}
impl<'de, 'a> EnumAccess<'de> for &'a mut CustomDeserializer<'de> {
type Error = Error;
type Variant = Self;
fn variant_seed<V>(self, seed: V) -> Result<(V::Value, Self::Variant), Self::Error>
where
V: serde::de::DeserializeSeed<'de>,
{
let key = self.parse_unsigned::<u32>()?;
Ok((seed.deserialize(key.into_deserializer())?, self))
}
}
impl<'de, 'a> VariantAccess<'de> for &'a mut CustomDeserializer<'de> {
type Error = Error;
fn unit_variant(self) -> Result<(), Self::Error> {
Ok(())
}
fn newtype_variant_seed<T>(self, seed: T) -> Result<T::Value, Self::Error>
where
T: serde::de::DeserializeSeed<'de>,
{
seed.deserialize(self)
}
fn tuple_variant<V>(self, _len: usize, visitor: V) -> Result<V::Value, Self::Error>
where
V: serde::de::Visitor<'de>,
{
self.deserialize_seq(visitor)
}
fn struct_variant<V>(
self,
fields: &'static [&'static str],
visitor: V,
) -> Result<V::Value, Self::Error>
where
V: serde::de::Visitor<'de>,
{
self.deserialize_struct("", fields, visitor)
}
}
struct SequenceDeserializer<'a, 'de: 'a> {
deserializer: &'a mut CustomDeserializer<'de>,
first: bool,
}
impl<'a, 'de> SequenceDeserializer<'a, 'de> {
pub fn new(deserializer: &'a mut CustomDeserializer<'de>) -> Self {
Self {
deserializer,
first: true,
}
}
}
impl<'de, 'a> SeqAccess<'de> for SequenceDeserializer<'a, 'de> {
type Error = Error;
fn next_element_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>, Self::Error>
where
T: serde::de::DeserializeSeed<'de>,
{
if self.deserializer.peek_token(Delimiter::Seq)? {
return Ok(None);
}
if !self.first {
if !self.deserializer.peek_token(Delimiter::SeqValue)? {
return Err(Error::ExpectedDelimiter(Delimiter::SeqValue));
}
self.deserializer.eat_token(Delimiter::SeqValue)?;
}
self.first = false;
seed.deserialize(&mut *self.deserializer).map(Some)
}
}
struct MapDeserializer<'a, 'de: 'a> {
deserializer: &'a mut CustomDeserializer<'de>,
first: bool,
}
impl<'a, 'de> MapDeserializer<'a, 'de> {
pub fn new(deserializer: &'a mut CustomDeserializer<'de>) -> Self {
Self {
deserializer,
first: true,
}
}
}
impl<'de, 'a> MapAccess<'de> for MapDeserializer<'a, 'de> {
type Error = Error;
fn next_key_seed<K>(&mut self, seed: K) -> Result<Option<K::Value>, Self::Error>
where
K: serde::de::DeserializeSeed<'de>,
{
if self.deserializer.peek_token(Delimiter::Map)? {
return Ok(None);
}
self.first = false;
let value = seed.deserialize(&mut *self.deserializer).map(Some)?;
if !self.deserializer.peek_token(Delimiter::MapKey)? {
return Err(Error::ExpectedDelimiter(Delimiter::MapKey));
}
self.deserializer.eat_token(Delimiter::MapKey)?;
Ok(value)
}
fn next_value_seed<V>(&mut self, seed: V) -> Result<V::Value, Self::Error>
where
V: serde::de::DeserializeSeed<'de>,
{
let value = seed.deserialize(&mut *self.deserializer)?;
if !self.deserializer.peek_token(Delimiter::MapValue)? {
return Err(Error::ExpectedDelimiter(Delimiter::MapValue));
}
self.deserializer.eat_token(Delimiter::MapValue)?;
Ok(value)
}
}