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}