use bitvec::{prelude as bv, slice::BitSlice};
use serde::{
ser::{
SerializeMap, SerializeSeq, SerializeStruct, SerializeStructVariant, SerializeTuple,
SerializeTupleStruct, SerializeTupleVariant,
},
Serialize, Serializer,
};
use super::error::Error;
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum Delimiter {
String = 134,
Byte = 135,
Unit = 2,
Seq = 3,
SeqValue = 4,
Map = 139,
MapKey = 6,
MapValue = 7,
}
impl std::fmt::Display for Delimiter {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
Delimiter::String => write!(f, "String"),
Delimiter::Byte => write!(f, "Byte"),
Delimiter::Unit => write!(f, "Unit"),
Delimiter::Seq => write!(f, "Seq"),
Delimiter::SeqValue => write!(f, "SeqValue"),
Delimiter::Map => write!(f, "Map"),
Delimiter::MapKey => write!(f, "MapKey"),
Delimiter::MapValue => write!(f, "MapValue"),
}
}
}
#[derive(Debug)]
struct CustomSerializer {
data: bv::BitVec<u8, bv::Lsb0>,
}
pub fn to_bytes<T: Serialize>(value: &T) -> Result<Vec<u8>, Error> {
let mut serializer = CustomSerializer {
data: bv::BitVec::new(),
};
value.serialize(&mut serializer)?;
Ok(serializer.data.into_vec())
}
impl CustomSerializer {
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(len - size..).ok_or(Error::NoByte)
}
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;
}
}
Ok(byte == token as u8)
}
pub fn peek_token_before_n_bits(&self, n: usize) -> Result<u8, Error> {
let bits = self._peek_n_bits(n + 3)?[0..3].as_ref();
let mut byte = 0u8;
for (i, bit) in bits.iter().enumerate() {
if *bit {
byte |= 1 << i;
}
}
Ok(byte)
}
pub fn serialize_token(&mut self, token: Delimiter) {
match token {
Delimiter::String => {
self.data
.extend(&[false, true, true, false, false, false, false, true]);
}
Delimiter::Byte => {
self.data
.extend(&[true, true, true, false, false, false, false, true]);
}
Delimiter::Unit => {
self.data.extend(&[false, true, false]); }
Delimiter::Seq => {
self.data.extend(&[true, true, false]); }
Delimiter::SeqValue => {
self.data.extend(&[false, false, true]); }
Delimiter::Map => {
self.data
.extend(&[true, true, false, true, false, false, false, true]);
}
Delimiter::MapKey => {
self.data.extend(&[false, true, true]); }
Delimiter::MapValue => {
self.data.extend(&[true, true, true]); }
}
}
}
impl<'a> Serializer for &'a mut CustomSerializer {
type Ok = ();
type Error = Error;
type SerializeSeq = Self;
type SerializeMap = Self;
type SerializeTuple = Self;
type SerializeStruct = Self;
type SerializeTupleStruct = Self;
type SerializeTupleVariant = Self;
type SerializeStructVariant = Self;
fn serialize_bool(self, v: bool) -> Result<Self::Ok, Self::Error> {
self.data.push(v);
Ok(())
}
fn serialize_i8(self, v: i8) -> Result<Self::Ok, Self::Error> {
self.data.extend(&v.to_le_bytes());
Ok(())
}
fn serialize_i16(self, v: i16) -> Result<Self::Ok, Self::Error> {
self.data.extend(&v.to_le_bytes());
Ok(())
}
fn serialize_i32(self, v: i32) -> Result<Self::Ok, Self::Error> {
self.data.extend(&v.to_le_bytes());
Ok(())
}
fn serialize_i64(self, v: i64) -> Result<Self::Ok, Self::Error> {
self.data.extend(&v.to_le_bytes());
Ok(())
}
fn serialize_u8(self, v: u8) -> Result<Self::Ok, Self::Error> {
self.data.extend(&v.to_le_bytes());
Ok(())
}
fn serialize_u16(self, v: u16) -> Result<Self::Ok, Self::Error> {
self.data.extend(&v.to_le_bytes());
Ok(())
}
fn serialize_u32(self, v: u32) -> Result<Self::Ok, Self::Error> {
self.data.extend(&v.to_le_bytes());
Ok(())
}
fn serialize_u64(self, v: u64) -> Result<Self::Ok, Self::Error> {
self.data.extend(&v.to_le_bytes());
Ok(())
}
fn serialize_f32(self, v: f32) -> Result<Self::Ok, Self::Error> {
self.data.extend(&v.to_le_bytes());
Ok(())
}
fn serialize_f64(self, v: f64) -> Result<Self::Ok, Self::Error> {
self.data.extend(&v.to_le_bytes());
Ok(())
}
fn serialize_char(self, v: char) -> Result<Self::Ok, Self::Error> {
self.serialize_u32(u32::from(v))
}
fn serialize_str(self, v: &str) -> Result<Self::Ok, Self::Error> {
self.data.extend(v.as_bytes());
self.serialize_token(Delimiter::String);
Ok(())
}
fn serialize_bytes(self, v: &[u8]) -> Result<Self::Ok, Self::Error> {
self.data.extend(v);
self.serialize_token(Delimiter::Byte);
Ok(())
}
fn serialize_unit(self) -> Result<Self::Ok, Self::Error> {
self.serialize_token(Delimiter::Unit);
Ok(())
}
fn serialize_none(self) -> Result<Self::Ok, Self::Error> {
self.serialize_unit()
}
fn serialize_some<T: ?Sized>(self, value: &T) -> Result<Self::Ok, Self::Error>
where
T: Serialize,
{
value.serialize(self)
}
fn serialize_unit_struct(self, _name: &'static str) -> Result<Self::Ok, Self::Error> {
self.serialize_unit()
}
fn serialize_newtype_struct<T: ?Sized>(
self,
_name: &'static str,
value: &T,
) -> Result<Self::Ok, Self::Error>
where
T: Serialize,
{
value.serialize(self)
}
fn serialize_tuple_struct(
self,
_name: &'static str,
len: usize,
) -> Result<Self::SerializeTupleStruct, Self::Error> {
self.serialize_tuple(len)
}
fn serialize_unit_variant(
self,
_name: &'static str,
variant_index: u32,
_variant: &'static str,
) -> Result<Self::Ok, Self::Error> {
self.serialize_u32(variant_index)
}
fn serialize_newtype_variant<T: ?Sized>(
self,
_name: &'static str,
variant_index: u32,
_variant: &'static str,
value: &T,
) -> Result<Self::Ok, Self::Error>
where
T: Serialize,
{
self.serialize_u32(variant_index)?;
value.serialize(self)
}
fn serialize_tuple_variant(
self,
_name: &'static str,
variant_index: u32,
_variant: &'static str,
len: usize,
) -> Result<Self::SerializeTupleVariant, Self::Error> {
self.serialize_u32(variant_index)?;
self.serialize_seq(Some(len))
}
fn serialize_struct_variant(
self,
_name: &'static str,
variant_index: u32,
_variant: &'static str,
len: usize,
) -> Result<Self::SerializeStructVariant, Self::Error> {
self.serialize_u32(variant_index)?;
self.serialize_map(Some(len))
}
fn serialize_seq(self, _len: Option<usize>) -> Result<Self::SerializeSeq, Self::Error> {
self.serialize_token(Delimiter::Seq);
Ok(self)
}
fn serialize_map(self, _len: Option<usize>) -> Result<Self::SerializeMap, Self::Error> {
Ok(self)
}
fn serialize_tuple(self, len: usize) -> Result<Self::SerializeTuple, Self::Error> {
self.serialize_seq(Some(len))
}
fn serialize_struct(
self,
_name: &'static str,
len: usize,
) -> Result<Self::SerializeStruct, Self::Error> {
self.serialize_map(Some(len))
}
}
impl<'a> SerializeSeq for &'a mut CustomSerializer {
type Ok = ();
type Error = Error;
fn serialize_element<T: ?Sized>(&mut self, value: &T) -> Result<(), Self::Error>
where
T: Serialize,
{
if !self.peek_token(Delimiter::Seq)? {
self.serialize_token(Delimiter::SeqValue);
}
value.serialize(&mut **self)
}
fn end(self) -> Result<Self::Ok, Self::Error> {
self.serialize_token(Delimiter::Seq);
Ok(())
}
}
impl<'a> SerializeMap for &'a mut CustomSerializer {
type Ok = ();
type Error = Error;
fn serialize_key<T: ?Sized>(&mut self, key: &T) -> Result<(), Self::Error>
where
T: Serialize,
{
key.serialize(&mut **self)?;
self.serialize_token(Delimiter::MapKey);
Ok(())
}
fn serialize_value<T: ?Sized>(&mut self, value: &T) -> Result<(), Self::Error>
where
T: Serialize,
{
value.serialize(&mut **self)?;
self.serialize_token(Delimiter::MapValue);
Ok(())
}
fn end(self) -> Result<Self::Ok, Self::Error> {
self.serialize_token(Delimiter::Map);
Ok(())
}
}
impl<'a> SerializeTuple for &'a mut CustomSerializer {
type Ok = ();
type Error = Error;
fn serialize_element<T: ?Sized>(&mut self, value: &T) -> Result<(), Self::Error>
where
T: Serialize,
{
if !self.peek_token(Delimiter::Seq)? {
self.serialize_token(Delimiter::SeqValue);
}
value.serialize(&mut **self)
}
fn end(self) -> Result<Self::Ok, Self::Error> {
self.serialize_token(Delimiter::Seq);
Ok(())
}
}
impl<'a> SerializeStruct for &'a mut CustomSerializer {
type Ok = ();
type Error = Error;
fn serialize_field<T: ?Sized>(
&mut self,
key: &'static str,
value: &T,
) -> Result<(), Self::Error>
where
T: Serialize,
{
key.serialize(&mut **self)?;
self.serialize_token(Delimiter::MapKey);
value.serialize(&mut **self)?;
self.serialize_token(Delimiter::MapValue);
Ok(())
}
fn end(self) -> Result<Self::Ok, Self::Error> {
self.serialize_token(Delimiter::Map);
Ok(())
}
}
impl<'a> SerializeTupleStruct for &'a mut CustomSerializer {
type Ok = ();
type Error = Error;
fn serialize_field<T: ?Sized>(&mut self, value: &T) -> Result<(), Self::Error>
where
T: Serialize,
{
if !self.peek_token(Delimiter::Seq)? {
self.serialize_token(Delimiter::SeqValue);
}
value.serialize(&mut **self)
}
fn end(self) -> Result<Self::Ok, Self::Error> {
self.serialize_token(Delimiter::Seq);
Ok(())
}
}
impl<'a> SerializeTupleVariant for &'a mut CustomSerializer {
type Ok = ();
type Error = Error;
fn serialize_field<T: ?Sized>(&mut self, value: &T) -> Result<(), Self::Error>
where
T: Serialize,
{
if self.peek_token_before_n_bits(32)? != Delimiter::Seq as u8 {
self.serialize_token(Delimiter::SeqValue);
}
value.serialize(&mut **self)
}
fn end(self) -> Result<Self::Ok, Self::Error> {
self.serialize_token(Delimiter::Seq);
Ok(())
}
}
impl<'a> SerializeStructVariant for &'a mut CustomSerializer {
type Ok = ();
type Error = Error;
fn serialize_field<T: ?Sized>(
&mut self,
key: &'static str,
value: &T,
) -> Result<(), Self::Error>
where
T: Serialize,
{
key.serialize(&mut **self)?;
self.serialize_token(Delimiter::MapKey);
value.serialize(&mut **self)?;
self.serialize_token(Delimiter::MapValue);
Ok(())
}
fn end(self) -> Result<Self::Ok, Self::Error> {
self.serialize_token(Delimiter::Map);
Ok(())
}
}