multi_tier_cache/
serialization.rs1use crate::error::CacheResult;
2use bytes::Bytes;
3use serde::Serialize;
4use serde::de::DeserializeOwned;
5use std::fmt::Debug;
6
7#[derive(Debug, Clone)]
9pub enum CacheSerializer {
10 Json(JsonSerializer),
12 #[cfg(feature = "bincode")]
14 Bincode(BincodeSerializer),
15 #[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 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 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 #[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#[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#[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#[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}