Skip to main content

weavatrix_memory/codec/
mod.rs

1#[cfg(feature = "json")]
2use crate::error::MemoryError;
3use crate::error::Result;
4
5#[cfg(feature = "compression")]
6mod compression;
7#[cfg(feature = "encryption")]
8mod encryption;
9
10#[cfg(feature = "compression")]
11pub use compression::Lz4Codec;
12#[cfg(feature = "encryption")]
13pub use encryption::{
14    EncryptionKey, EncryptionKeys, NonceSource, OsNonce, StaticKey, XChaCha20Codec,
15};
16
17/// Deterministic serialization boundary used by durable stores.
18pub trait Codec<T> {
19    /// Encodes one value.
20    ///
21    /// # Errors
22    ///
23    /// Returns a codec-specific serialization error.
24    fn encode(&self, value: &T) -> Result<Vec<u8>>;
25
26    /// Decodes one complete value.
27    ///
28    /// # Errors
29    ///
30    /// Returns a codec-specific deserialization error.
31    fn decode(&self, bytes: &[u8]) -> Result<T>;
32}
33
34#[cfg(feature = "json")]
35#[derive(Debug, Clone, Copy, Default)]
36pub struct JsonCodec;
37
38#[cfg(feature = "json")]
39impl<T> Codec<T> for JsonCodec
40where
41    T: serde::Serialize + serde::de::DeserializeOwned,
42{
43    fn encode(&self, value: &T) -> Result<Vec<u8>> {
44        blazingly_json::to_vec(value).map_err(|error| MemoryError::Codec {
45            message: error.to_string(),
46        })
47    }
48
49    fn decode(&self, bytes: &[u8]) -> Result<T> {
50        blazingly_json::from_slice(bytes).map_err(|error| MemoryError::Codec {
51            message: error.to_string(),
52        })
53    }
54}