reinhardt_auth/sessions/
serialization.rs1use serde::{Deserialize, Serialize};
38use thiserror::Error;
39
40mod json;
42pub use json::JsonSerializer;
43
44#[cfg(feature = "messagepack")]
45mod messagepack;
46#[cfg(feature = "messagepack")]
47pub use messagepack::MessagePackSerializer;
48
49#[cfg(feature = "cbor")]
50mod cbor;
51#[cfg(feature = "cbor")]
52pub use cbor::CborSerializer;
53
54#[cfg(feature = "bincode")]
55mod bincode;
56#[cfg(feature = "bincode")]
57pub use self::bincode::BincodeSerializer;
58
59#[non_exhaustive]
61#[derive(Debug, Error)]
62pub enum SerializationError {
63 #[error("JSON error: {0}")]
65 JsonError(#[from] serde_json::Error),
66
67 #[cfg(feature = "messagepack")]
69 #[error("MessagePack error: {0}")]
70 MessagePackError(#[from] rmp_serde::encode::Error),
71
72 #[cfg(feature = "messagepack")]
74 #[error("MessagePack decode error: {0}")]
75 MessagePackDecodeError(#[from] rmp_serde::decode::Error),
76
77 #[error("Serialization failed: {0}")]
79 SerializationFailed(String),
80
81 #[error("Deserialization failed: {0}")]
83 DeserializationFailed(String),
84
85 #[error("Unsupported serialization format")]
87 UnsupportedFormat,
88}
89
90pub trait Serializer: Send + Sync {
116 fn serialize<T: Serialize>(&self, data: &T) -> Result<Vec<u8>, SerializationError>;
118
119 fn deserialize<T: for<'de> Deserialize<'de>>(
121 &self,
122 bytes: &[u8],
123 ) -> Result<T, SerializationError>;
124}
125
126#[derive(Debug, Clone, Copy, PartialEq, Eq)]
137pub enum SerializationFormat {
138 Json,
140 #[cfg(feature = "messagepack")]
142 MessagePack,
143 #[cfg(feature = "cbor")]
145 Cbor,
146 #[cfg(feature = "bincode")]
148 Bincode,
149}
150
151impl SerializationFormat {
152 pub fn name(&self) -> &'static str {
162 match self {
163 SerializationFormat::Json => "json",
164 #[cfg(feature = "messagepack")]
165 SerializationFormat::MessagePack => "messagepack",
166 #[cfg(feature = "cbor")]
167 SerializationFormat::Cbor => "cbor",
168 #[cfg(feature = "bincode")]
169 SerializationFormat::Bincode => "bincode",
170 }
171 }
172
173 pub fn serialize<T: Serialize>(&self, data: &T) -> Result<Vec<u8>, SerializationError> {
193 match self {
194 SerializationFormat::Json => JsonSerializer.serialize(data),
195 #[cfg(feature = "messagepack")]
196 SerializationFormat::MessagePack => MessagePackSerializer.serialize(data),
197 #[cfg(feature = "cbor")]
198 SerializationFormat::Cbor => CborSerializer.serialize(data),
199 #[cfg(feature = "bincode")]
200 SerializationFormat::Bincode => BincodeSerializer.serialize(data),
201 }
202 }
203
204 pub fn deserialize<T: for<'de> Deserialize<'de>>(
206 &self,
207 bytes: &[u8],
208 ) -> Result<T, SerializationError> {
209 match self {
210 SerializationFormat::Json => JsonSerializer.deserialize(bytes),
211 #[cfg(feature = "messagepack")]
212 SerializationFormat::MessagePack => MessagePackSerializer.deserialize(bytes),
213 #[cfg(feature = "cbor")]
214 SerializationFormat::Cbor => CborSerializer.deserialize(bytes),
215 #[cfg(feature = "bincode")]
216 SerializationFormat::Bincode => BincodeSerializer.deserialize(bytes),
217 }
218 }
219}
220
221impl Default for SerializationFormat {
222 fn default() -> Self {
233 Self::Json
234 }
235}
236
237#[cfg(test)]
238mod tests {
239 use super::*;
240
241 #[test]
242 fn test_serialization_format_name() {
243 assert_eq!(SerializationFormat::Json.name(), "json");
244
245 #[cfg(feature = "messagepack")]
246 assert_eq!(SerializationFormat::MessagePack.name(), "messagepack");
247
248 #[cfg(feature = "cbor")]
249 assert_eq!(SerializationFormat::Cbor.name(), "cbor");
250
251 #[cfg(feature = "bincode")]
252 assert_eq!(SerializationFormat::Bincode.name(), "bincode");
253 }
254
255 #[test]
256 fn test_serialization_format_default() {
257 let format = SerializationFormat::default();
258 assert_eq!(format, SerializationFormat::Json);
259 }
260
261 #[test]
262 fn test_serialization_format_serialize_deserialize() {
263 let format = SerializationFormat::Json;
264
265 let data = serde_json::json!({"test": "value"});
266 let bytes = format.serialize(&data).unwrap();
267 let restored: serde_json::Value = format.deserialize(&bytes).unwrap();
268
269 assert_eq!(restored["test"], "value");
270 }
271}