use crate::{Buffer, BufferAtom};
use miette::IntoDiagnostic;
use serde::{Deserialize, Serialize};
pub fn try_serialize<T: Serialize>(data: &T) -> miette::Result<Buffer> {
serde_json::to_vec(data).into_diagnostic()
}
pub fn try_deserialize<T: for<'de> Deserialize<'de>>(
buffer: &[BufferAtom],
) -> miette::Result<T> {
serde_json::from_slice(buffer).into_diagnostic()
}
#[cfg(test)]
mod tests_json_serde {
use crate::{Buffer, json_serde};
use pretty_assertions::assert_eq;
use serde::{Deserialize, Serialize};
#[derive(Debug, PartialEq, Serialize, Deserialize)]
struct TestPayload {
pub id: f32,
pub description: String,
pub data: Buffer,
}
#[test]
fn test_json_serde() -> miette::Result<()> {
let value = TestPayload {
id: 12.0,
description: "foo bar".to_string(),
data: vec![0, 1, 2],
};
let res_struct_to_bytes = json_serde::try_serialize(&value);
assert!(res_struct_to_bytes.is_ok());
let struct_to_bytes: Buffer = res_struct_to_bytes?;
println!("{struct_to_bytes:?}");
let res = json_serde::try_deserialize::<TestPayload>(&struct_to_bytes);
assert!(res.is_ok());
let result_struct_from_bytes = res?;
let struct_from_bytes: TestPayload = result_struct_from_bytes;
println!("{struct_from_bytes:?}");
assert_eq!(value, struct_from_bytes);
Ok(())
}
}