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 EncodeError: Error + Send + Sync; type DecodeError: Error + Send + Sync;
fn serialize(&self, packet: SendingPacket) -> Result<Vec<u8>, Self::EncodeError>;
fn deserialize(&self, data: &[u8]) -> Result<ReceivingPacket, Self::DecodeError>;
}
pub enum SerializerAdapter<ReceivingPacket, SendingPacket, EncErr, DecErr>
where
EncErr: Error + Send + Sync,
DecErr: Error + Send + Sync,
{
ReadOnly(
Arc<
dyn ReadOnlySerializer<
ReceivingPacket,
SendingPacket,
EncodeError = EncErr,
DecodeError = DecErr,
>,
>,
),
Mutable(
Arc<
Mutex<
dyn MutableSerializer<
ReceivingPacket,
SendingPacket,
EncodeError = EncErr,
DecodeError = DecErr,
>,
>,
>,
),
}
impl<ReceivingPacket, SendingPacket, EncErr, DecErr> Serializer<ReceivingPacket, SendingPacket>
for SerializerAdapter<ReceivingPacket, SendingPacket, EncErr, DecErr>
where
SendingPacket: Send + Sync + Debug + 'static,
ReceivingPacket: Send + Sync + Debug + 'static,
EncErr: Error + Send + Sync + 'static,
DecErr: Error + Send + Sync + 'static,
{
type EncodeError = EncErr;
type DecodeError = DecErr;
fn serialize(&self, packet: SendingPacket) -> Result<Vec<u8>, Self::EncodeError> {
match self {
SerializerAdapter::ReadOnly(serializer) => serializer.serialize(packet),
SerializerAdapter::Mutable(serializer) => serializer.lock().unwrap().serialize(packet),
}
}
fn deserialize(&self, data: &[u8]) -> Result<ReceivingPacket, Self::DecodeError> {
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 EncodeError: Error + Send + Sync;
type DecodeError: Error + Send + Sync;
fn serialize(&self, packet: SendingPacket) -> Result<Vec<u8>, Self::EncodeError>;
fn deserialize(&self, buffer: &[u8]) -> Result<ReceivingPacket, Self::DecodeError>;
}
pub trait MutableSerializer<ReceivingPacket, SendingPacket>: Send + Sync + 'static {
type EncodeError: Error + Send + Sync;
type DecodeError: Error + Send + Sync;
fn serialize(&mut self, p: SendingPacket) -> Result<Vec<u8>, Self::EncodeError>;
fn deserialize(&mut self, buf: &[u8]) -> Result<ReceivingPacket, Self::DecodeError>;
}