use serde::{Serialize, de::DeserializeOwned};
use crate::error::ServerlessError;
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum SerializerType {
Json,
Postcard,
}
impl SerializerType {
pub fn serialize<T: Serialize>(&self, value: &T) -> Result<Vec<u8>, ServerlessError> {
match self {
SerializerType::Json => Ok(serde_json::to_vec(value)?),
SerializerType::Postcard => Ok(postcard::to_allocvec(value)?),
}
}
pub fn deserialize<T: DeserializeOwned>(&self, bytes: &[u8]) -> Result<T, ServerlessError> {
match self {
SerializerType::Json => Ok(serde_json::from_slice(bytes)?),
SerializerType::Postcard => Ok(postcard::from_bytes(bytes)?),
}
}
}
#[must_use]
pub fn get_default_serializer_type() -> SerializerType {
#[cfg(any(
feature = "json_serialization",
not(any(feature = "json_serialization", feature = "postcard_serialization"))
))]
{
SerializerType::Json
}
#[cfg(all(
feature = "postcard_serialization",
not(feature = "json_serialization")
))]
{
SerializerType::Postcard
}
}
#[derive(Clone)]
pub struct Serializer {
serializer_type: SerializerType,
}
impl Serializer {
#[must_use]
pub fn new(serializer_type: SerializerType) -> Self {
Self { serializer_type }
}
pub fn serialize<T: Serialize>(&self, value: &T) -> Result<Vec<u8>, ServerlessError> {
self.serializer_type.serialize(value)
}
pub fn deserialize<T: DeserializeOwned>(&self, bytes: &[u8]) -> Result<T, ServerlessError> {
self.serializer_type.deserialize(bytes)
}
}
#[must_use]
pub fn get_default_serializer() -> Serializer {
Serializer::new(get_default_serializer_type())
}
#[cfg(test)]
mod tests {
use super::*;
use serde::{Deserialize, Serialize};
#[derive(Serialize, Deserialize, Debug, PartialEq)]
struct TestData {
name: String,
value: u32,
}
#[test]
fn test_json_serializer() {
let serializer = Serializer::new(SerializerType::Json);
let data = TestData {
name: "test".to_string(),
value: 42,
};
let serialized = serializer.serialize(&data).unwrap();
let deserialized: TestData = serializer.deserialize(&serialized).unwrap();
assert_eq!(data, deserialized);
}
#[test]
fn test_postcard_serializer() {
let serializer = Serializer::new(SerializerType::Postcard);
let data = TestData {
name: "test".to_string(),
value: 42,
};
let serialized = serializer.serialize(&data).unwrap();
let deserialized: TestData = serializer.deserialize(&serialized).unwrap();
assert_eq!(data, deserialized);
}
#[test]
fn test_default_serializer() {
let serializer = get_default_serializer();
let data = TestData {
name: "test".to_string(),
value: 42,
};
let serialized = serializer.serialize(&data).unwrap();
let deserialized: TestData = serializer.deserialize(&serialized).unwrap();
assert_eq!(data, deserialized);
}
}