use std::ops::Deref;
use serde::{Deserialize, Serialize};
pub trait SerializationProvider {
type SerializedBytes: Deref<Target = [u8]>;
type Error: std::error::Error;
fn serialize<T>(value: &T) -> Result<Self::SerializedBytes, Self::Error>
where
T: Serialize;
fn serialized_size<T>(value: &T) -> Result<usize, Self::Error>
where
T: Serialize;
fn deserialize<'a, T>(bytes: &'a [u8]) -> Result<T, Self::Error>
where
T: Deserialize<'a>;
}
pub mod bincode {
pub struct BinCode;
impl super::SerializationProvider for BinCode {
type Error = bincode::Error;
type SerializedBytes = Vec<u8>;
fn serialize<T>(value: &T) -> Result<Self::SerializedBytes, Self::Error>
where
T: serde::Serialize,
{
bincode::serialize(value)
}
fn serialized_size<T>(value: &T) -> Result<usize, Self::Error>
where
T: serde::Serialize,
{
bincode::serialized_size(value).map(|x| x as usize)
}
fn deserialize<'a, T>(bytes: &'a [u8]) -> Result<T, Self::Error>
where
T: serde::Deserialize<'a>,
{
bincode::deserialize(bytes)
}
}
}