use serde::{Deserialize, Serialize};
use std::{fmt::Debug, io};
use thiserror::Error;
use crate::cipher::Stream;
pub trait Marshaling: BinaryMarshaler + BinaryUnmarshaler {
fn marshal_size(&self) -> usize;
fn marshal_to(&self, w: &mut impl io::Write) -> Result<(), MarshallingError>;
fn unmarshal_from(&mut self, r: &mut impl io::Read) -> Result<(), MarshallingError>;
fn unmarshal_from_random(&mut self, r: &mut (impl io::Read + Stream));
fn marshal_id(&self) -> [u8; 8];
}
#[derive(Error, Debug)]
pub enum MarshallingError {
#[error("could not serialize data")]
Serialization(bincode::Error),
#[error("could not deserialize data")]
Deserialization(bincode::Error),
#[error("input data is not valid")]
InvalidInput(String),
#[error("io error")]
IoError(#[from] std::io::Error),
}
pub trait BinaryMarshaler {
fn marshal_binary(&self) -> Result<Vec<u8>, MarshallingError>;
}
pub trait BinaryUnmarshaler {
fn unmarshal_binary(&mut self, data: &[u8]) -> Result<(), MarshallingError>;
}
pub fn marshal_binary<T: Serialize>(x: &T) -> Result<Vec<u8>, MarshallingError> {
bincode::serialize(x).map_err(MarshallingError::Serialization)
}
pub fn unmarshal_binary<'de, T: Deserialize<'de>>(
x: &mut T,
data: &'de [u8],
) -> Result<(), MarshallingError> {
*x = bincode::deserialize(data).map_err(MarshallingError::Deserialization)?;
Ok(())
}