Skip to main content

disintegrate_serde/serde/
messagepack.rs

1use rmp_serde;
2use std::marker::PhantomData;
3
4use serde::Deserialize;
5use serde::Serialize;
6
7use super::Error;
8use crate::serde::Deserializer;
9use crate::serde::Serializer;
10
11/// A struct to serialize and deserialize MessagePack payloads.
12#[derive(Debug, Clone, Copy)]
13pub struct MessagePack<T>(PhantomData<T>);
14
15impl<T> Default for crate::serde::messagepack::MessagePack<T> {
16    fn default() -> Self {
17        Self(PhantomData)
18    }
19}
20impl<T> Serializer<T> for crate::serde::messagepack::MessagePack<T>
21where
22    T: Serialize,
23{
24    /// Serializes the given value to MessagePack format and returns the serialized bytes.
25    ///
26    /// # Arguments
27    ///
28    /// * `value` - The value to be serialized.
29    ///
30    /// # Returns
31    ///
32    /// Serialized bytes representing the value in MessagePack format.
33    fn serialize(&self, value: T) -> Vec<u8> {
34        rmp_serde::to_vec(&value).expect("MessagePack serialization failed")
35    }
36}
37
38impl<T> Deserializer<T> for crate::serde::messagepack::MessagePack<T>
39where
40    for<'d> T: Deserialize<'d>,
41{
42    /// Deserializes the given MessagePack bytes to produce a value of type `T`.
43    ///
44    /// # Arguments
45    ///
46    /// * `data` - The MessagePack bytes to be deserialized.
47    ///
48    /// # Returns
49    ///
50    /// A `Result` containing the deserialized value on success, or an error on failure.
51    fn deserialize(&self, data: Vec<u8>) -> Result<T, Error> {
52        rmp_serde::from_slice(&data).map_err(|e| Error::Deserialization(Box::new(e)))
53    }
54}
55
56#[cfg(test)]
57mod tests {
58    use super::*;
59
60    #[derive(Debug, Serialize, Deserialize, PartialEq, Clone)]
61    struct Person {
62        name: String,
63        age: u32,
64    }
65
66    #[test]
67    fn it_serialize_and_deserialize_messagepack_data() {
68        let msgpack_serializer = crate::serde::messagepack::MessagePack::<Person>::default();
69        let person = Person {
70            name: String::from("Some Name"),
71            age: 30,
72        };
73
74        let serialized_data = msgpack_serializer.serialize(person.clone());
75        let deserialized_person = msgpack_serializer.deserialize(serialized_data).unwrap();
76
77        assert_eq!(person, deserialized_person);
78    }
79}