extension2/
extension2.rs

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}