use serde::de::DeserializeOwned;
use serde::Serialize;
use pamoja_core::{Error, Result};
use crate::Codec;
#[derive(Clone, Copy, Debug, Default)]
pub struct JsonCodec;
impl<T> Codec<T> for JsonCodec
where
T: Serialize + DeserializeOwned,
{
fn encode(&self, value: &T) -> Result<Vec<u8>> {
serde_json::to_vec(value).map_err(|error| Error::Codec(error.to_string()))
}
fn decode(&self, bytes: &[u8]) -> Result<T> {
serde_json::from_slice(bytes).map_err(|error| Error::Codec(error.to_string()))
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn round_trips_a_map() {
use std::collections::BTreeMap;
let codec = JsonCodec;
let mut value = BTreeMap::new();
value.insert("sensor".to_owned(), 21i64);
let encoded = codec.encode(&value).expect("encode");
let decoded: BTreeMap<String, i64> = codec.decode(&encoded).expect("decode");
assert_eq!(decoded, value);
}
#[test]
fn decoding_invalid_json_is_a_codec_error() {
let codec = JsonCodec;
let result: Result<Vec<i32>> = codec.decode(b"not json");
assert!(matches!(result, Err(Error::Codec(_))));
}
}