use super::{flatten_slice_elements, DeserializationError, Vec};
mod byte_reader;
pub use byte_reader::{ByteReader, SliceReader};
mod byte_writer;
pub use byte_writer::ByteWriter;
pub trait Serializable: Sized {
fn write_into<W: ByteWriter>(&self, target: &mut W);
fn to_bytes(&self) -> Vec<u8> {
let mut result = Vec::with_capacity(self.get_size_hint());
self.write_into(&mut result);
result
}
fn write_batch_into<W: ByteWriter>(source: &[Self], target: &mut W) {
for item in source {
item.write_into(target);
}
}
fn get_size_hint(&self) -> usize {
0
}
}
impl Serializable for () {
fn write_into<W: ByteWriter>(&self, _target: &mut W) {}
}
impl<T: Serializable> Serializable for Vec<T> {
fn write_into<W: ByteWriter>(&self, target: &mut W) {
T::write_batch_into(self, target);
}
}
impl<T: Serializable> Serializable for &Vec<T> {
fn write_into<W: ByteWriter>(&self, target: &mut W) {
T::write_batch_into(self, target);
}
}
impl<T: Serializable, const N: usize> Serializable for Vec<[T; N]> {
fn write_into<W: ByteWriter>(&self, target: &mut W) {
let source = flatten_slice_elements(self);
T::write_batch_into(source, target);
}
}
impl<T: Serializable, const N: usize> Serializable for &Vec<[T; N]> {
fn write_into<W: ByteWriter>(&self, target: &mut W) {
let source = flatten_slice_elements(self);
T::write_batch_into(source, target);
}
}
impl<T: Serializable> Serializable for &[T] {
fn write_into<W: ByteWriter>(&self, target: &mut W) {
T::write_batch_into(self, target);
}
}
impl<T: Serializable, const N: usize> Serializable for &[[T; N]] {
fn write_into<W: ByteWriter>(&self, target: &mut W) {
let source = flatten_slice_elements(self);
T::write_batch_into(source, target);
}
}
pub trait Deserializable: Sized {
fn read_from<R: ByteReader>(source: &mut R) -> Result<Self, DeserializationError>;
fn read_from_bytes(bytes: &[u8]) -> Result<Self, DeserializationError> {
Self::read_from(&mut SliceReader::new(bytes))
}
fn read_batch_from<R: ByteReader>(
source: &mut R,
num_elements: usize,
) -> Result<Vec<Self>, DeserializationError> {
let mut result = Vec::with_capacity(num_elements);
for _ in 0..num_elements {
let element = Self::read_from(source)?;
result.push(element)
}
Ok(result)
}
}