use core::fmt::Debug;
use std::{
error::Error,
sync::{Arc, Mutex},
};
pub trait Serializer<ReceivingPacket, SendingPacket>: Send + Sync + 'static
where
ReceivingPacket: Send + Sync + Debug + 'static,
SendingPacket: Send + Sync + Debug + 'static,
{
type Error: Error + Send + Sync;
fn serialize(&self, packet: SendingPacket) -> Result<Vec<u8>, Self::Error>;
fn deserialize(&self, data: &[u8]) -> Result<ReceivingPacket, Self::Error>;
}
pub enum SerializerAdapter<ReceivingPacket, SendingPacket, E>
where
E: Error + Send + Sync,
{
ReadOnly(Arc<dyn ReadOnlySerializer<ReceivingPacket, SendingPacket, Error = E>>),
Mutable(Arc<Mutex<dyn MutableSerializer<ReceivingPacket, SendingPacket, Error = E>>>),
}
impl<ReceivingPacket, SendingPacket, E> Serializer<ReceivingPacket, SendingPacket>
for SerializerAdapter<ReceivingPacket, SendingPacket, E>
where
SendingPacket: Send + Sync + Debug + 'static,
ReceivingPacket: Send + Sync + Debug + 'static,
E: Error + Send + Sync + 'static,
{
type Error = E;
fn serialize(&self, packet: SendingPacket) -> Result<Vec<u8>, Self::Error> {
match self {
SerializerAdapter::ReadOnly(serializer) => serializer.serialize(packet),
SerializerAdapter::Mutable(serializer) => serializer.lock().unwrap().serialize(packet),
}
}
fn deserialize(&self, data: &[u8]) -> Result<ReceivingPacket, Self::Error> {
match self {
SerializerAdapter::ReadOnly(serializer) => serializer.deserialize(data),
SerializerAdapter::Mutable(serializer) => serializer.lock().unwrap().deserialize(data),
}
}
}
pub trait ReadOnlySerializer<ReceivingPacket, SendingPacket>: Send + Sync + 'static {
type Error: Error + Send + Sync;
fn serialize(&self, packet: SendingPacket) -> Result<Vec<u8>, Self::Error>;
fn deserialize(&self, buffer: &[u8]) -> Result<ReceivingPacket, Self::Error>;
}
pub trait MutableSerializer<ReceivingPacket, SendingPacket>: Send + Sync + 'static {
type Error: Error + Send + Sync;
fn serialize(&mut self, p: SendingPacket) -> Result<Vec<u8>, Self::Error>;
fn deserialize(&mut self, buf: &[u8]) -> Result<ReceivingPacket, Self::Error>;
}