1use serde::{Serialize, de::DeserializeOwned};
2
3use crate::error::TaskResult;
4
5pub trait Codec: Send + Sync + 'static {
7 fn encode<T: Serialize>(&self, value: &T) -> TaskResult<Vec<u8>>;
8 fn decode<T: DeserializeOwned>(&self, data: &[u8]) -> TaskResult<T>;
9}
10
11#[derive(Debug, Clone, Default)]
13pub struct JsonCodec;
14
15impl Codec for JsonCodec {
16 fn encode<T: Serialize>(&self, value: &T) -> TaskResult<Vec<u8>> {
17 Ok(serde_json::to_vec(value)?)
18 }
19
20 fn decode<T: DeserializeOwned>(&self, data: &[u8]) -> TaskResult<T> {
21 Ok(serde_json::from_slice(data)?)
22 }
23}
24
25#[cfg(test)]
26mod tests {
27 use super::*;
28 use serde::{Deserialize, Serialize};
29
30 #[derive(Debug, PartialEq, Serialize, Deserialize)]
31 struct TestPayload {
32 name: String,
33 value: i32,
34 }
35
36 #[test]
37 fn json_codec_roundtrip() {
38 let codec = JsonCodec;
39 let payload = TestPayload {
40 name: "test".to_string(),
41 value: 42,
42 };
43 let encoded = codec.encode(&payload).unwrap();
44 let decoded: TestPayload = codec.decode(&encoded).unwrap();
45 assert_eq!(payload, decoded);
46 }
47}