Skip to main content

kojin_core/
codec.rs

1use serde::{Serialize, de::DeserializeOwned};
2
3use crate::error::TaskResult;
4
5/// Serialization codec for task payloads.
6pub 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/// JSON codec using serde_json.
12#[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}