use bytes::Bytes;
use serde::{de::DeserializeOwned, Serialize};
use crate::{CacheError, Result};
pub trait CacheCodec: Clone + Send + Sync + 'static {
fn encode<T>(&self, value: &T) -> Result<Bytes>
where
T: Serialize;
fn decode<T>(&self, bytes: &Bytes) -> Result<T>
where
T: DeserializeOwned;
}
#[derive(Debug, Clone, Copy, Default)]
pub struct PostcardCodec;
impl CacheCodec for PostcardCodec {
fn encode<T>(&self, value: &T) -> Result<Bytes>
where
T: Serialize,
{
postcard::to_allocvec(value)
.map(Bytes::from)
.map_err(|source| CacheError::Encode(source.to_string()))
}
fn decode<T>(&self, bytes: &Bytes) -> Result<T>
where
T: DeserializeOwned,
{
postcard::from_bytes(bytes).map_err(|source| CacheError::Decode(source.to_string()))
}
}