Skip to main content

multi_tier_cache/
serialization.rs

1use crate::error::CacheResult;
2use bytes::Bytes;
3use serde::Serialize;
4use serde::de::DeserializeOwned;
5use std::fmt::Debug;
6
7/// High-performance cache data serialization enum
8#[derive(Debug, Clone)]
9pub enum CacheSerializer {
10    /// Default JSON serializer
11    Json(JsonSerializer),
12    /// Binary serializer using bincode
13    #[cfg(feature = "bincode")]
14    Bincode(BincodeSerializer),
15    /// Binary serializer using `MessagePack`
16    #[cfg(feature = "msgpack")]
17    MsgPack(MsgPackSerializer),
18}
19
20impl Default for CacheSerializer {
21    fn default() -> Self {
22        Self::Json(JsonSerializer)
23    }
24}
25
26impl CacheSerializer {
27    /// Serialize a value to Bytes
28    ///
29    /// # Errors
30    ///
31    /// Returns a `SerializationError` if the value cannot be serialized.
32    pub fn serialize<T: Serialize>(&self, value: &T) -> CacheResult<Bytes> {
33        match self {
34            Self::Json(_) => JsonSerializer::serialize_internal(value),
35            #[cfg(feature = "bincode")]
36            Self::Bincode(_) => BincodeSerializer::serialize_internal(value),
37            #[cfg(feature = "msgpack")]
38            Self::MsgPack(_) => MsgPackSerializer::serialize_internal(value),
39        }
40    }
41
42    /// Deserialize Bytes to a value
43    ///
44    /// # Errors
45    ///
46    /// Returns a `SerializationError` if the bytes cannot be deserialized.
47    pub fn deserialize<T: DeserializeOwned>(&self, bytes: &[u8]) -> CacheResult<T> {
48        match self {
49            Self::Json(_) => JsonSerializer::deserialize_internal(bytes),
50            #[cfg(feature = "bincode")]
51            Self::Bincode(_) => BincodeSerializer::deserialize_internal(bytes),
52            #[cfg(feature = "msgpack")]
53            Self::MsgPack(_) => MsgPackSerializer::deserialize_internal(bytes),
54        }
55    }
56
57    /// Serializer identifier
58    #[must_use]
59    pub fn name(&self) -> &'static str {
60        match self {
61            Self::Json(_) => "Json",
62            #[cfg(feature = "bincode")]
63            Self::Bincode(_) => "Bincode",
64            #[cfg(feature = "msgpack")]
65            Self::MsgPack(_) => "MsgPack",
66        }
67    }
68}
69
70/// Default JSON serializer using `serde_json`
71#[derive(Debug, Default, Clone)]
72pub struct JsonSerializer;
73
74impl JsonSerializer {
75    fn serialize_internal<T: Serialize>(value: &T) -> CacheResult<Bytes> {
76        serde_json::to_vec(value)
77            .map(Bytes::from)
78            .map_err(|e| crate::error::CacheError::SerializationError(e.to_string()))
79    }
80
81    fn deserialize_internal<T: DeserializeOwned>(bytes: &[u8]) -> CacheResult<T> {
82        serde_json::from_slice(bytes)
83            .map_err(|e| crate::error::CacheError::SerializationError(e.to_string()))
84    }
85}
86
87/// Binary serializer using bincode
88#[cfg(feature = "bincode")]
89#[derive(Debug, Default, Clone)]
90pub struct BincodeSerializer;
91
92#[cfg(feature = "bincode")]
93impl BincodeSerializer {
94    fn serialize_internal<T: Serialize>(value: &T) -> CacheResult<Bytes> {
95        bincode::serialize(value)
96            .map(Bytes::from)
97            .map_err(|e| crate::error::CacheError::SerializationError(e.to_string()))
98    }
99
100    fn deserialize_internal<T: DeserializeOwned>(bytes: &[u8]) -> CacheResult<T> {
101        bincode::deserialize(bytes)
102            .map_err(|e| crate::error::CacheError::SerializationError(e.to_string()))
103    }
104}
105
106/// Binary serializer using `MessagePack`
107#[cfg(feature = "msgpack")]
108#[derive(Debug, Default, Clone)]
109pub struct MsgPackSerializer;
110
111#[cfg(feature = "msgpack")]
112impl MsgPackSerializer {
113    fn serialize_internal<T: Serialize>(value: &T) -> CacheResult<Bytes> {
114        rmp_serde::to_vec(value)
115            .map(Bytes::from)
116            .map_err(|e| crate::error::CacheError::SerializationError(e.to_string()))
117    }
118
119    fn deserialize_internal<T: DeserializeOwned>(bytes: &[u8]) -> CacheResult<T> {
120        rmp_serde::from_slice(bytes)
121            .map_err(|e| crate::error::CacheError::SerializationError(e.to_string()))
122    }
123}