1use byteorder::{LittleEndian, ReadBytesExt};
4
5pub fn encode(object: &impl serde::Serialize) -> Vec<u8> {
10 bincode::serialize(object).unwrap()
11}
12
13pub fn encode_with_size(object: &impl serde::Serialize) -> Vec<u8> {
18 let mut data = Vec::new();
19 let serial = encode(object);
20 data.extend((serial.len() as u64).to_le_bytes().iter());
21 data.extend(serial.iter());
22 data
23}
24
25pub fn decode<'a, T: serde::Deserialize<'a>>(data: &'a [u8]) -> T {
30 bincode::deserialize(data).unwrap()
31}
32
33pub fn decode_with_size<'a, T: serde::Deserialize<'a>>(data: &'a [u8]) -> T {
38 decode(&data[8..])
39}
40
41pub unsafe fn decode_with_size_ptr<'a, T: serde::Deserialize<'a>>(data: *const u8) -> T {
47 let size = std::slice::from_raw_parts(data, 8)
48 .read_u64::<LittleEndian>()
49 .unwrap();
50 let data = std::slice::from_raw_parts(data.offset(8), size as usize);
51 decode(&data)
52}