Skip to main content

memlink_protocol/
msgpack.rs

1//! MessagePack serializer implementation.
2//!
3//! Provides MessagePackSerializer struct implementing the Serializer trait
4//! using rmp-serde for high-performance binary serialization.
5
6use alloc::format;
7use alloc::vec::Vec;
8
9use crate::emsg::ErrorMessage;
10use crate::error::{ProtocolError, Result};
11use crate::request::Request;
12use crate::response::Response;
13use crate::serializer::Serializer;
14
15#[derive(Debug, Clone, Copy, Default, PartialEq, Eq)]
16pub struct MessagePackSerializer;
17
18impl MessagePackSerializer {
19    pub const fn new() -> Self {
20        Self
21    }
22}
23
24pub const MSGPACK: MessagePackSerializer = MessagePackSerializer;
25
26impl Serializer for MessagePackSerializer {
27    fn serialize<T: serde::Serialize>(&self, value: &T) -> Result<Vec<u8>> {
28        rmp_serde::to_vec(value).map_err(|e| {
29            ProtocolError::SerializationFailed(format!("MessagePack serialization error: {}", e))
30        })
31    }
32
33    fn deserialize<T: serde::de::DeserializeOwned>(&self, bytes: &[u8]) -> Result<T> {
34        rmp_serde::from_slice(bytes).map_err(|e| {
35            ProtocolError::SerializationFailed(format!(
36                "MessagePack deserialization error: {}",
37                e
38            ))
39        })
40    }
41
42    fn serialize_request(&self, req: &Request) -> Result<Vec<u8>> {
43        self.serialize(req)
44    }
45
46    fn deserialize_request(&self, bytes: &[u8]) -> Result<Request> {
47        self.deserialize(bytes)
48    }
49
50    fn serialize_response(&self, resp: &Response) -> Result<Vec<u8>> {
51        self.serialize(resp)
52    }
53
54    fn deserialize_response(&self, bytes: &[u8]) -> Result<Response> {
55        self.deserialize(bytes)
56    }
57
58    fn serialize_error(&self, err: &ErrorMessage) -> Result<Vec<u8>> {
59        self.serialize(err)
60    }
61
62    fn deserialize_error(&self, bytes: &[u8]) -> Result<ErrorMessage> {
63        self.deserialize(bytes)
64    }
65}
66
67pub fn default_serializer() -> &'static MessagePackSerializer {
68    &MSGPACK
69}