use std::cmp::min;
use crate::protocol::packets::packet_definer::{PacketDirection, PacketState};
use crate::protocol::serialization::serializer_error::SerializingErr;
mod serializer_types;
pub mod serializer_error;
mod serializer_testing;
pub type SerializingResult<'a, T> = Result<T, SerializingErr>;
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
pub struct McSerializer {
pub output: Vec<u8>
}
impl McSerializer {
pub fn new() -> Self {
Self {
output: vec![]
}
}
pub fn init_size(size: usize) -> Self {
Self {
output: Vec::with_capacity(size)
}
}
pub fn set_size(&mut self, size: usize) -> SerializingResult<()> {
if size < self.output.len() {
return Err(SerializingErr::UniqueFailure("Cannot set size to less than current length".to_string()));
}
self.output.reserve(size);
Ok(())
}
pub fn clear(&mut self) {
self.output.clear();
}
pub fn serialize_bytes(&mut self, input: &[u8]) {
for b in input {
self.output.push(*b);
}
}
pub fn serialize_vec(&mut self, vec: Vec<u8>) {
self.serialize_bytes(&vec);
}
pub fn serialize_u8(&mut self, b: u8) {
self.output.push(b);
}
pub fn serialize_str_no_length_prefix(&mut self, s: &str) {
self.serialize_bytes(s.as_bytes());
}
pub fn get_last(&self) -> Option<&u8> {
self.output.last()
}
pub fn merge(&mut self, serializer: McSerializer) {
self.serialize_bytes(&serializer.output);
}
}
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
pub struct McDeserializer<'a> {
pub data: &'a [u8],
pub index: usize
}
impl <'a> McDeserializer<'a> {
pub fn new(data: &'a [u8]) -> Self {
Self {
data,
index: 0
}
}
pub fn collect_remaining(&self) -> &[u8] {
&self.data[self.index..]
}
pub fn slice(&mut self, bound: usize) -> &[u8] {
let actual = min(self.data.len(), bound) + self.index;
let actual = min(actual, self.data.len());
let slice = &self.data[self.index..actual];
self.increment(slice.len());
slice
}
pub fn slice_option(&mut self, bound: usize) -> Option<&[u8]> {
if self.index + bound > self.data.len() {
return None;
}
let slice = &self.data[self.index..(self.index + bound)];
self.increment(bound);
Some(slice)
}
pub fn pop(&mut self) -> Option<u8> {
if self.index < self.data.len() {
let u = self.data[self.index];
self.increment(1);
Some(u)
} else {
None
}
}
pub fn increment(&mut self, amount: usize) {
self.index += amount;
}
pub fn increment_by_diff(&mut self, other: usize) {
if other > self.index {
self.increment(other - self.index);
}
}
pub fn is_at_end(&self) -> bool {
self.index >= self.data.len()
}
pub fn reset(&mut self) {
self.index = 0;
}
pub fn create_sub_deserializer(&self) -> McDeserializer {
McDeserializer::new(&self.data[self.index..])
}
pub fn sub_deserializer_length(&mut self, end: usize) -> SerializingResult<McDeserializer> {
if self.index + end > self.data.len() {
return Err(SerializingErr::UniqueFailure("Sub-deserializer length exceeds data length".to_string()));
}
let ret = Ok(McDeserializer::new(&self.data[self.index..(self.index + end)]));
self.index += end;
ret
}
}
pub trait McDeserialize {
fn mc_deserialize<'a>(deserializer: &'a mut McDeserializer) -> SerializingResult<'a, Self> where Self: Sized;
}
pub trait StateBasedDeserializer {
fn deserialize_state<'a>(deserializer: &'a mut McDeserializer, state: PacketState, packet_direction: PacketDirection) -> SerializingResult<'a, Self> where Self: Sized;
}
pub trait McSerialize {
fn mc_serialize(&self, serializer: &mut McSerializer) -> SerializingResult<()>;
}