use apalis_core::backend::codec::Codec;
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Default)]
pub struct MsgPackCodec;
#[derive(thiserror::Error, Debug)]
pub enum MsgPackCodecError {
#[error("Encoding error: {0}")]
EncodeError(#[from] rmp_serde::encode::Error),
#[error("Decoding error: {0}")]
DecodeError(#[from] rmp_serde::decode::Error),
}
impl<T: Serialize + for<'de> Deserialize<'de>> Codec<T> for MsgPackCodec {
type Compact = Vec<u8>;
type Error = MsgPackCodecError;
fn encode(input: &T) -> Result<Vec<u8>, Self::Error> {
Ok(rmp_serde::to_vec(input)?)
}
fn decode(compact: &Vec<u8>) -> Result<T, Self::Error> {
Ok(rmp_serde::from_slice(compact)?)
}
}
#[cfg(test)]
mod tests {
use super::*;
#[derive(Serialize, Deserialize, Debug, PartialEq)]
struct TestStruct {
id: u32,
name: String,
}
#[test]
fn test_encode_decode_roundtrip() {
let original = TestStruct {
id: 1,
name: "Test".to_string(),
};
let encoded = MsgPackCodec::encode(&original).expect("Encoding failed");
let decoded: TestStruct = MsgPackCodec::decode(&encoded).expect("Decoding failed");
assert_eq!(original, decoded);
}
}