protosocket_messagepack/
serializer.rs

1use std::marker::PhantomData;
2
3/// A serializer that takes a `serde::Serialize` T and implements
4/// `protosocket::Serialize`. You can use this with a `protosocket`
5/// Connection or rpc.
6#[derive(Debug)]
7pub struct MessagePackSerializer<T> {
8    _phantom: std::marker::PhantomData<T>,
9}
10
11impl<T> Default for MessagePackSerializer<T> {
12    fn default() -> Self {
13        Self {
14            _phantom: PhantomData,
15        }
16    }
17}
18
19impl<T> protosocket::Serialize for MessagePackSerializer<T>
20where
21    T: serde::Serialize + std::fmt::Debug,
22{
23    type Message = T;
24
25    fn serialize_into_buffer(&mut self, message: Self::Message, buffer: &mut Vec<u8>) {
26        log::debug!("encoding {message:?}");
27        // reserve length prefix
28        buffer.extend_from_slice(&[0; 5]);
29        rmp_serde::encode::write(buffer, &message).expect("messages must be encodable");
30        let len = buffer.len();
31        unsafe {
32            buffer.set_len(0);
33        }
34        rmp::encode::write_u32(buffer, len as u32 - 5).expect("message length is encodable");
35        unsafe {
36            buffer.set_len(len);
37        }
38    }
39}