wapc_codec/
messagepack.rs

1//! Serialization/Deserialization functions for transmitting data to waPC hosts and guests as MessagePack bytes.
2//!
3//!```
4//! use serde::{Serialize, Deserialize};
5//! use wapc_codec::messagepack::{serialize,deserialize};
6//!
7//! #[derive(Deserialize, Serialize, Debug, PartialEq, Eq)]
8//! struct Person {
9//!   first_name: String,
10//!   last_name: String,
11//!   age: u8,
12//! }
13//!
14//! let person = Person {
15//!   first_name: "Samuel".to_owned(),
16//!   last_name: "Clemens".to_owned(),
17//!   age: 49,
18//! };
19//!
20//! println!("Original : {:?}", person);
21//!
22//! let bytes = serialize(&person).unwrap();
23//!
24//! println!("Serialized messagepack bytes: {:?}", bytes);
25//!
26//! let round_trip: Person = deserialize(&bytes).unwrap();
27//!
28//! assert_eq!(person, round_trip);
29//!```
30
31use std::io::Cursor;
32
33use rmp_serde::{Deserializer, Serializer};
34use serde::{Deserialize, Serialize};
35
36use crate::errors;
37
38/// [`serialize()`] serializes a structure into MessagePack bytes.
39pub 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
50/// [`deserialize()`] converts a MessagePack-formatted list of bytes into the target data structure.
51pub 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}