use miette::IntoDiagnostic;
use serde::{Deserialize, Serialize};
use crate::{Buffer, BufferAtom};
pub fn try_serialize<T: Serialize>(data: &T) -> miette::Result<Buffer> {
let buffer = bincode::serde::encode_to_vec(data, get_config()).into_diagnostic()?;
Ok(buffer)
}
pub fn try_deserialize<T: for<'de> Deserialize<'de>>(
buffer: &[BufferAtom],
) -> miette::Result<T> {
let res = bincode::serde::decode_from_slice::<T, _>(buffer, get_config());
match res {
Ok((payload, _bytes_read)) => Ok(payload),
Err(err) => {
let err_msg = format!("{err:?}");
miette::bail!("Failed to deserialize: {}", err_msg)
}
}
}
fn get_config() -> bincode::config::Configuration { bincode::config::standard() }
#[cfg(test)]
mod tests_bincode_serde {
use pretty_assertions::assert_eq;
use serde::{Deserialize, Serialize};
use crate::{bincode_serde, Buffer};
#[derive(Debug, PartialEq, Serialize, Deserialize)]
struct TestPayload {
pub id: f32,
pub description: String,
pub data: Buffer,
}
#[test]
#[allow(clippy::missing_errors_doc)]
fn test_bincode_serde() -> miette::Result<()> {
let value = TestPayload {
id: 12.0,
description: "foo bar".to_string(),
data: vec![0, 1, 2],
};
let res_struct_to_bytes = bincode_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 = bincode_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(())
}
}