serverless_fn/
serializer.rs1use serde::{Serialize, de::DeserializeOwned};
6
7use crate::error::ServerlessError;
8
9#[derive(Clone, Copy, Debug, PartialEq, Eq)]
11pub enum SerializerType {
12 Json,
14 Postcard,
16}
17
18impl SerializerType {
19 pub fn serialize<T: Serialize>(&self, value: &T) -> Result<Vec<u8>, ServerlessError> {
25 match self {
26 SerializerType::Json => Ok(serde_json::to_vec(value)?),
27 SerializerType::Postcard => Ok(postcard::to_allocvec(value)?),
28 }
29 }
30
31 pub fn deserialize<T: DeserializeOwned>(&self, bytes: &[u8]) -> Result<T, ServerlessError> {
37 match self {
38 SerializerType::Json => Ok(serde_json::from_slice(bytes)?),
39 SerializerType::Postcard => Ok(postcard::from_bytes(bytes)?),
40 }
41 }
42}
43
44#[must_use]
46pub fn get_default_serializer_type() -> SerializerType {
47 #[cfg(any(
48 feature = "json_serialization",
49 not(any(feature = "json_serialization", feature = "postcard_serialization"))
50 ))]
51 {
52 SerializerType::Json
53 }
54 #[cfg(all(
55 feature = "postcard_serialization",
56 not(feature = "json_serialization")
57 ))]
58 {
59 SerializerType::Postcard
60 }
61}
62
63#[derive(Clone)]
65pub struct Serializer {
66 serializer_type: SerializerType,
67}
68
69impl Serializer {
70 #[must_use]
72 pub fn new(serializer_type: SerializerType) -> Self {
73 Self { serializer_type }
74 }
75
76 pub fn serialize<T: Serialize>(&self, value: &T) -> Result<Vec<u8>, ServerlessError> {
82 self.serializer_type.serialize(value)
83 }
84
85 pub fn deserialize<T: DeserializeOwned>(&self, bytes: &[u8]) -> Result<T, ServerlessError> {
91 self.serializer_type.deserialize(bytes)
92 }
93}
94
95#[must_use]
97pub fn get_default_serializer() -> Serializer {
98 Serializer::new(get_default_serializer_type())
99}
100
101#[cfg(test)]
102mod tests {
103 use super::*;
104 use serde::{Deserialize, Serialize};
105
106 #[derive(Serialize, Deserialize, Debug, PartialEq)]
107 struct TestData {
108 name: String,
109 value: u32,
110 }
111
112 #[test]
113 fn test_json_serializer() {
114 let serializer = Serializer::new(SerializerType::Json);
115 let data = TestData {
116 name: "test".to_string(),
117 value: 42,
118 };
119
120 let serialized = serializer.serialize(&data).unwrap();
121 let deserialized: TestData = serializer.deserialize(&serialized).unwrap();
122 assert_eq!(data, deserialized);
123 }
124
125 #[test]
126 fn test_postcard_serializer() {
127 let serializer = Serializer::new(SerializerType::Postcard);
128 let data = TestData {
129 name: "test".to_string(),
130 value: 42,
131 };
132
133 let serialized = serializer.serialize(&data).unwrap();
134 let deserialized: TestData = serializer.deserialize(&serialized).unwrap();
135 assert_eq!(data, deserialized);
136 }
137
138 #[test]
139 fn test_default_serializer() {
140 let serializer = get_default_serializer();
141 let data = TestData {
142 name: "test".to_string(),
143 value: 42,
144 };
145
146 let serialized = serializer.serialize(&data).unwrap();
147 let deserialized: TestData = serializer.deserialize(&serialized).unwrap();
148 assert_eq!(data, deserialized);
149 }
150}