Skip to main content

weavatrix_memory/
codec.rs

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