1use byteorder::{ReadBytesExt, WriteBytesExt};
2use chrono::prelude::*;
3use messagepack_rs::binary::Binary;
4use messagepack_rs::deserializable::{Deserializable, DeserializeError};
5use messagepack_rs::extension::Extension;
6use messagepack_rs::marker::Marker;
7use messagepack_rs::serializable::{Serializable, SerializeError};
8use messagepack_rs_macros::MessagePackFrom;
9use std::collections::BTreeMap;
10use std::io::{BufReader, Cursor, Read};
11
12#[derive(Clone, Debug, PartialEq)]
13struct Rgba {
14 r: u8,
15 g: u8,
16 b: u8,
17 a: u8,
18}
19
20#[derive(Clone, Debug, PartialEq, MessagePackFrom)]
21enum MyValue {
22 Nil,
23 Bool(bool),
24 Float32(f32),
25 Float64(f64),
26 UInt8(u8),
27 UInt16(u16),
28 UInt32(u32),
29 UInt64(u64),
30 Int8(i8),
31 Int16(i16),
32 Int32(i32),
33 Int64(i64),
34 Binary(Binary),
35 String(String),
36 Array(Vec<Self>),
37 Map(BTreeMap<String, Self>),
38 Extension(Extension),
39 Timestamp(DateTime<Utc>),
40 Rgba(Rgba),
41}
42
43impl From<Rgba> for MyValue {
44 fn from(value: Rgba) -> Self {
45 Self::Rgba(value)
46 }
47}
48
49impl Serializable for MyValue {
50 fn serialize(self) -> Result<Vec<u8>, SerializeError> {
51 match self {
52 Self::Nil => Self::serialize_nil(),
53 Self::Bool(v) => Self::serialize_bool(v),
54 Self::Float32(v) => Self::serialize_float32(v),
55 Self::Float64(v) => Self::serialize_float64(v),
56 Self::UInt8(v) => Self::serialize_uint8(v),
57 Self::UInt16(v) => Self::serialize_uint16(v),
58 Self::UInt32(v) => Self::serialize_uint32(v),
59 Self::UInt64(v) => Self::serialize_uint64(v),
60 Self::Int8(v) => Self::serialize_int8(v),
61 Self::Int16(v) => Self::serialize_int16(v),
62 Self::Int32(v) => Self::serialize_int32(v),
63 Self::Int64(v) => Self::serialize_int64(v),
64 Self::Binary(v) => Self::serialize_binary(v),
65 Self::String(v) => Self::serialize_string(v),
66 Self::Array(v) => Self::serialize_array(v),
67 Self::Map(v) => Self::serialize_map(v),
68 Self::Extension(v) => Self::serialize_extension(v),
69 Self::Timestamp(v) => Self::serialize_timestamp(v),
70 Self::Rgba(v) => {
71 let mut w = Vec::with_capacity(1 + 1 + 4);
72 w.write_u8(Marker::FixExt4.into()).or(Err(SerializeError::FailedToWrite))?;
73 w.write_i8(0).or(Err(SerializeError::FailedToWrite))?;
74 w.write_u8(v.r).or(Err(SerializeError::FailedToWrite))?;
75 w.write_u8(v.g).or(Err(SerializeError::FailedToWrite))?;
76 w.write_u8(v.b).or(Err(SerializeError::FailedToWrite))?;
77 w.write_u8(v.a).or(Err(SerializeError::FailedToWrite))?;
78 Ok(w)
79 },
80 }
81 }
82}
83
84impl Deserializable for MyValue {
85 fn deserialize_extension_for_the_you_type_defined<R: Read>(t: i8, size: usize, buf_reader: &mut R) -> Result<Self, DeserializeError> {
86 if t == 0 {
87 Ok(From::from(Rgba {
88 r: buf_reader.read_u8().or(Err(DeserializeError::InvalidValue))?,
89 g: buf_reader.read_u8().or(Err(DeserializeError::InvalidValue))?,
90 b: buf_reader.read_u8().or(Err(DeserializeError::InvalidValue))?,
91 a: buf_reader.read_u8().or(Err(DeserializeError::InvalidValue))?,
92 }))
93 } else {
94 Self::deserialize_extension_others(t, size, buf_reader)
95 }
96 }
97}
98
99fn main() {
100 let rgba = Rgba { r: 5, g: 10, b: 15, a: 20 };
101 let value = MyValue::from(rgba);
102 println!("{:?}", value);
103
104 let serialized_value = value.serialize().unwrap();
105 println!("{:?}", serialized_value);
106
107 let deserialized_value = MyValue::deserialize(&mut BufReader::new(Cursor::new(serialized_value))).unwrap();
108 println!("{:?}", deserialized_value);
109}