wapc_codec/
messagepack.rs1use std::io::Cursor;
32
33use rmp_serde::{Deserializer, Serializer};
34use serde::{Deserialize, Serialize};
35
36use crate::errors;
37
38pub fn serialize<T>(item: T) -> Result<Vec<u8>, errors::Error>
40where
41 T: Serialize,
42{
43 let mut buf = Vec::new();
44 item
45 .serialize(&mut Serializer::new(&mut buf).with_struct_map())
46 .map_err(|e| errors::new(errors::ErrorKind::MessagePackSerialization(e)))?;
47 Ok(buf)
48}
49
50pub fn deserialize<'de, T: Deserialize<'de>>(buf: &[u8]) -> Result<T, errors::Error> {
52 let mut de = Deserializer::new(Cursor::new(buf));
53 Deserialize::deserialize(&mut de).map_err(|e| errors::new(errors::ErrorKind::MessagePackDeserialization(e)))
54}
55
56#[cfg(test)]
57mod tests {
58 use super::*;
59
60 #[derive(Deserialize, Serialize, Debug, PartialEq, Eq)]
61 struct Person {
62 first_name: String,
63 last_name: String,
64 age: u8,
65 }
66
67 #[test]
68 fn test() {
69 let person = Person {
70 first_name: "Samuel".to_owned(),
71 last_name: "Clemens".to_owned(),
72 age: 49,
73 };
74
75 println!("Original : {:?}", person);
76
77 let bytes = serialize(&person).unwrap();
78
79 println!("Serialized messagepack bytes: {:?}", bytes);
80
81 let round_trip: Person = deserialize(&bytes).unwrap();
82
83 assert_eq!(person, round_trip);
84 }
85}