use crate::error::WireFormatError;
use serde::{Deserialize, Serialize, de::DeserializeOwned};
pub const WIRE_FORMAT_MAJOR: u64 = 0;
#[derive(Serialize)]
struct EnvelopeRef<'a, T: ?Sized> {
#[serde(rename = "__sassi_v")]
version: u64,
payload: &'a T,
}
#[derive(Deserialize)]
struct EnvelopeVersion {
#[serde(rename = "__sassi_v")]
version: u64,
}
#[derive(Deserialize)]
struct Envelope<T> {
#[serde(rename = "__sassi_v")]
_version: u64,
payload: T,
}
pub fn to_vec<T: Serialize + ?Sized>(payload: &T) -> Result<Vec<u8>, WireFormatError> {
let envelope = EnvelopeRef {
version: WIRE_FORMAT_MAJOR,
payload,
};
serde_json::to_vec(&envelope).map_err(WireFormatError::from)
}
pub fn from_slice<T: DeserializeOwned>(bytes: &[u8]) -> Result<T, WireFormatError> {
let version: EnvelopeVersion = serde_json::from_slice(bytes)?;
if version.version != WIRE_FORMAT_MAJOR {
return Err(WireFormatError::VersionMismatch {
got: version.version,
expected: WIRE_FORMAT_MAJOR,
});
}
let envelope: Envelope<T> = serde_json::from_slice(bytes)?;
Ok(envelope.payload)
}