use crate::Result;
#[cfg(feature = "compression")]
mod compression;
#[cfg(feature = "encryption")]
mod encryption;
#[cfg(feature = "compression")]
pub use compression::Lz4Codec;
#[cfg(feature = "encryption")]
pub use encryption::{
EncryptionKey, EncryptionKeys, NonceSource, OsNonce, StaticKey, XChaCha20Codec,
};
pub trait Codec<T> {
fn encode(&self, value: &T) -> Result<Vec<u8>>;
fn decode(&self, bytes: &[u8]) -> Result<T>;
}
#[cfg(feature = "json")]
#[derive(Debug, Clone, Copy, Default)]
pub struct JsonCodec;
#[cfg(feature = "json")]
impl<T> Codec<T> for JsonCodec
where
T: serde::Serialize + serde::de::DeserializeOwned,
{
fn encode(&self, value: &T) -> Result<Vec<u8>> {
serde_json::to_vec(value).map_err(|error| crate::MemoryError::Codec {
message: error.to_string(),
})
}
fn decode(&self, bytes: &[u8]) -> Result<T> {
serde_json::from_slice(bytes).map_err(|error| crate::MemoryError::Codec {
message: error.to_string(),
})
}
}