1pub trait Codec: Clone + Sync + Send + 'static {
2 fn encode<T: serde::Serialize>(&self, value: &T) -> anyhow::Result<Vec<u8>>;
3 fn decode<T: serde::de::DeserializeOwned>(&self, data: &[u8]) -> anyhow::Result<T>;
4}
5
6pub mod json {
7 use crate::codec::Codec;
8 use serde::Serialize;
9 use serde::de::DeserializeOwned;
10
11 #[derive(Clone)]
12 pub struct JsonCodec;
13
14 impl JsonCodec {
15 pub fn new() -> Self {
16 Self {}
17 }
18 }
19
20 impl Codec for JsonCodec {
21 fn encode<T: Serialize>(&self, value: &T) -> anyhow::Result<Vec<u8>> {
22 let json = serde_json::to_vec(value)?;
23 Ok(json)
24 }
25
26 fn decode<T: DeserializeOwned>(&self, data: &[u8]) -> anyhow::Result<T> {
27 let val = serde_json::from_slice(data)?;
28 Ok(val)
29 }
30 }
31}