use serde::{Deserialize, Serialize};
use thiserror::Error;
#[derive(Debug, Error)]
#[error(transparent)]
pub struct MarshalError(#[from] MarshalErrorRepr);
#[derive(Debug, Error)]
enum MarshalErrorRepr {
#[error("couldn't serialize: {0}")]
Postcard(#[from] postcard::Error),
}
type MarshalResult<T> = Result<T, MarshalError>;
pub trait Marshal<'de>: Serialize + Deserialize<'de> {
fn to_byte_vec(&self) -> MarshalResult<Vec<u8>> {
Ok(postcard::to_allocvec(self).map_err(MarshalErrorRepr::Postcard)?)
}
fn from_bytes(bytes: &'de [u8]) -> MarshalResult<Self> {
let decoded = postcard::from_bytes(bytes).map_err(MarshalErrorRepr::Postcard)?;
Ok(decoded)
}
}
impl<'de, T> Marshal<'de> for T where T: Serialize + Deserialize<'de> {}