messagepack_rs/
deserializable.rs

1use byteorder::{BigEndian, ReadBytesExt};
2use chrono::prelude::*;
3use crate::binary::Binary;
4use crate::extension::Extension;
5use crate::marker::Marker;
6use std::collections::BTreeMap;
7use std::io::Read;
8
9#[derive(Debug)]
10pub enum DeserializeError {
11    InvalidLength,
12    InvalidMarker,
13    InvalidValue,
14}
15
16pub trait Deserializable: Sized + From<Option<Self>> + From<bool> + From<Binary> + From<f32> + From<f64> + From<u8> + From<u16> + From<u32> + From<u64> + From<i8> + From<i16> + From<i32> + From<i64> + From<String> + From<Vec<Self>> + From<BTreeMap<String, Self>> + From<Extension> + From<DateTime<Utc>> {
17    fn deserialize<R: Read>(buf_reader: &mut R) -> Result<Self, DeserializeError> {
18        match Marker::from(buf_reader.read_u8().or(Err(DeserializeError::InvalidMarker))?) {
19            Marker::PositiveFixInt(n) => Ok(Self::from(n)),
20            Marker::FixMap(n) => Self::deserialize_map(n as usize, buf_reader),
21            Marker::FixArray(n) => Self::deserialize_array(n as usize, buf_reader),
22            Marker::FixStr(n) => Self::deserialize_string(n as usize, buf_reader),
23            Marker::Nil => Ok(Self::from(None::<Self>)),
24            Marker::Reserved => Err(DeserializeError::InvalidMarker),
25            Marker::False => Ok(Self::from(false)),
26            Marker::True => Ok(Self::from(true)),
27            Marker::Bin8 => Self::deserialize_binary(buf_reader.read_u8().or(Err(DeserializeError::InvalidLength))? as usize, buf_reader),
28            Marker::Bin16 => Self::deserialize_binary(buf_reader.read_u16::<BigEndian>().or(Err(DeserializeError::InvalidLength))? as usize, buf_reader),
29            Marker::Bin32 => Self::deserialize_binary(buf_reader.read_u32::<BigEndian>().or(Err(DeserializeError::InvalidLength))? as usize, buf_reader),
30            Marker::Ext8 => Self::deserialize_extension(buf_reader.read_u8().or(Err(DeserializeError::InvalidLength))? as usize, buf_reader),
31            Marker::Ext16 => Self::deserialize_extension(buf_reader.read_u16::<BigEndian>().or(Err(DeserializeError::InvalidLength))? as usize, buf_reader),
32            Marker::Ext32 => Self::deserialize_extension(buf_reader.read_u32::<BigEndian>().or(Err(DeserializeError::InvalidLength))? as usize, buf_reader),
33            Marker::Float32 => Ok(Self::from(buf_reader.read_f32::<BigEndian>().or(Err(DeserializeError::InvalidValue))?)),
34            Marker::Float64 => Ok(Self::from(buf_reader.read_f64::<BigEndian>().or(Err(DeserializeError::InvalidValue))?)),
35            Marker::UInt8 => Ok(Self::from(buf_reader.read_u8().or(Err(DeserializeError::InvalidValue))?)),
36            Marker::UInt16 => Ok(Self::from(buf_reader.read_u16::<BigEndian>().or(Err(DeserializeError::InvalidValue))?)),
37            Marker::UInt32 => Ok(Self::from(buf_reader.read_u32::<BigEndian>().or(Err(DeserializeError::InvalidValue))?)),
38            Marker::UInt64 => Ok(Self::from(buf_reader.read_u64::<BigEndian>().or(Err(DeserializeError::InvalidValue))?)),
39            Marker::Int8 => Ok(Self::from(buf_reader.read_i8().or(Err(DeserializeError::InvalidValue))?)),
40            Marker::Int16 => Ok(Self::from(buf_reader.read_i16::<BigEndian>().or(Err(DeserializeError::InvalidValue))?)),
41            Marker::Int32 => Ok(Self::from(buf_reader.read_i32::<BigEndian>().or(Err(DeserializeError::InvalidValue))?)),
42            Marker::Int64 => Ok(Self::from(buf_reader.read_i64::<BigEndian>().or(Err(DeserializeError::InvalidValue))?)),
43            Marker::FixExt1 => Self::deserialize_extension(1, buf_reader),
44            Marker::FixExt2 => Self::deserialize_extension(2, buf_reader),
45            Marker::FixExt4 => Self::deserialize_extension(4, buf_reader),
46            Marker::FixExt8 => Self::deserialize_extension(8, buf_reader),
47            Marker::FixExt16 => Self::deserialize_extension(16, buf_reader),
48            Marker::Str8 => Self::deserialize_string(buf_reader.read_u8().or(Err(DeserializeError::InvalidLength))? as usize, buf_reader),
49            Marker::Str16 => Self::deserialize_string(buf_reader.read_u16::<BigEndian>().or(Err(DeserializeError::InvalidLength))? as usize, buf_reader),
50            Marker::Str32 => Self::deserialize_string(buf_reader.read_u32::<BigEndian>().or(Err(DeserializeError::InvalidLength))? as usize, buf_reader),
51            Marker::Array16 => Self::deserialize_array(buf_reader.read_u16::<BigEndian>().or(Err(DeserializeError::InvalidLength))? as usize, buf_reader),
52            Marker::Array32 => Self::deserialize_array(buf_reader.read_u32::<BigEndian>().or(Err(DeserializeError::InvalidLength))? as usize, buf_reader),
53            Marker::Map16 => Self::deserialize_map(buf_reader.read_u16::<BigEndian>().or(Err(DeserializeError::InvalidLength))? as usize, buf_reader),
54            Marker::Map32 => Self::deserialize_map(buf_reader.read_u32::<BigEndian>().or(Err(DeserializeError::InvalidLength))? as usize, buf_reader),
55            Marker::NegativeFixInt(n) => Ok(Self::from(n)),
56        }
57    }
58
59    fn deserialize_binary<R: Read>(size: usize, buf_reader: &mut R) -> Result<Self, DeserializeError> {
60        let mut buf = vec![0; size];
61        buf_reader.read_exact(&mut buf[..]).or(Err(DeserializeError::InvalidValue))?;
62        Ok(From::from(Binary(buf)))
63    }
64
65    fn deserialize_string<R: Read>(size: usize, buf_reader: &mut R) -> Result<Self, DeserializeError> {
66        let mut buf = vec![0; size];
67        buf_reader.read_exact(&mut buf).or(Err(DeserializeError::InvalidValue))?;
68        Ok(From::from(String::from_utf8(buf).or(Err(DeserializeError::InvalidValue))?))
69    }
70
71    fn deserialize_array<R: Read>(size: usize, buf_reader: &mut R) -> Result<Self, DeserializeError> {
72        let mut buf = Vec::with_capacity(size);
73        for _ in 0..size {
74            buf.push(Self::deserialize(buf_reader)?);
75        }
76        Ok(From::from(buf))
77    }
78
79    fn deserialize_map<R: Read>(size: usize, buf_reader: &mut R) -> Result<Self, DeserializeError> {
80        fn deserialize_string_primitive<R: Read>(buf_reader: &mut R) -> Result<String, DeserializeError> {
81            let mut buf = match From::from(buf_reader.read_u8().or(Err(DeserializeError::InvalidMarker))?) {
82                Marker::FixStr(n) => vec![0; n as usize],
83                Marker::Str8 => vec![0; buf_reader.read_u8().or(Err(DeserializeError::InvalidLength))? as usize],
84                Marker::Str16 => vec![0; buf_reader.read_u16::<BigEndian>().or(Err(DeserializeError::InvalidLength))? as usize],
85                Marker::Str32 => vec![0; buf_reader.read_u32::<BigEndian>().or(Err(DeserializeError::InvalidLength))? as usize],
86                _ => Err(DeserializeError::InvalidMarker)?
87            };
88            buf_reader.read_exact(&mut buf[..]).or(Err(DeserializeError::InvalidValue))?;
89            String::from_utf8(buf).or(Err(DeserializeError::InvalidValue))
90        }
91
92        let mut buf = BTreeMap::new();
93        for _ in 0..size {
94            buf.insert(deserialize_string_primitive(buf_reader)?, Self::deserialize(buf_reader)?);
95        }
96        Ok(From::from(buf))
97    }
98
99    fn deserialize_extension<R: Read>(size: usize, buf_reader: &mut R) -> Result<Self, DeserializeError> {
100        let t = buf_reader.read_i8().or(Err(DeserializeError::InvalidLength))?;
101
102        if t == -1 {
103            if size == 4 {
104                let value = buf_reader.read_u32::<BigEndian>().or(Err(DeserializeError::InvalidValue))?;
105                Utc.timestamp_opt(i64::from(value), 0).single().map(Self::from).ok_or(DeserializeError::InvalidValue)
106            } else if size == 8 {
107                let value = buf_reader.read_u64::<BigEndian>().or(Err(DeserializeError::InvalidValue))?;
108                let nano = value >> 34;
109                let sec = value & 0x00_00_00_03_ff_ff_ff_ff;
110                Utc.timestamp_opt(sec as i64, nano as u32).single().map(Self::from).ok_or(DeserializeError::InvalidValue)
111            } else if size == 12 {
112                let nano = buf_reader.read_u32::<BigEndian>().or(Err(DeserializeError::InvalidValue))?;
113                let sec = buf_reader.read_i64::<BigEndian>().or(Err(DeserializeError::InvalidValue))?;
114                Utc.timestamp_opt(sec, nano).single().map(Self::from).ok_or(DeserializeError::InvalidValue)
115            } else {
116                Err(DeserializeError::InvalidValue)
117            }
118        } else {
119            Self::deserialize_extension_for_the_you_type_defined(t, size, buf_reader)
120        }
121    }
122
123    fn deserialize_extension_for_the_you_type_defined<R: Read>(t: i8, size: usize, buf_reader: &mut R) -> Result<Self, DeserializeError> {
124        Self::deserialize_extension_others(t, size, buf_reader)
125    }
126
127    fn deserialize_extension_others<R: Read>(t: i8, size: usize, buf_reader: &mut R) -> Result<Self, DeserializeError> {
128        let mut data = vec![0; size];
129        buf_reader.read_exact(&mut data[..]).or(Err(DeserializeError::InvalidValue))?;
130        Ok(From::from(Extension { t, data }))
131    }
132}