use serde::Serialize;
use serde::de::DeserializeOwned;
use crate::bus::abi::CodecId;
pub trait Codec {
const ID: CodecId;
fn encode<T: Serialize>(value: &T) -> Result<Vec<u8>, CodecError>;
fn decode<T: DeserializeOwned>(bytes: &[u8]) -> Result<T, CodecError>;
}
pub struct MessagePack;
impl Codec for MessagePack {
const ID: CodecId = CodecId::MessagePack;
fn encode<T: Serialize>(value: &T) -> Result<Vec<u8>, CodecError> {
rmp_serde::to_vec_named(value).map_err(|e| CodecError::Encode(e.to_string()))
}
fn decode<T: DeserializeOwned>(bytes: &[u8]) -> Result<T, CodecError> {
rmp_serde::from_slice(bytes).map_err(|e| CodecError::Decode(e.to_string()))
}
}
#[derive(Debug, thiserror::Error)]
pub enum CodecError {
#[error("failed to encode body: {0}")]
Encode(String),
#[error("failed to decode body: {0}")]
Decode(String),
}