1use std::collections::BTreeMap;
2use value::Value;
3use bytes::bytes;
4use io::{Reader, VecReader};
5
6pub struct Deserializer<R: Reader> {
7 pub reader: R,
8}
9
10pub fn from_bytes(bytes: Vec<u8>) -> Value
11{
12 let vec_reader = VecReader{input: bytes};
13 let mut d = Deserializer::from_vec_reader(vec_reader);
14 d.parse_value()
15}
16
17pub enum TestValue {
18 Int(u64),
19}
20
21#[inline]
22fn u8_slice_to_u16(slice: &[u8]) -> u16 {
23 ((slice[0] as u16) & 0xff) << 8 |
24 ((slice[1] as u16) & 0xff)
25}
26
27#[inline]
28fn u8_slice_to_u32(slice: &[u8]) -> u32 {
29 ((slice[0] as u32) & 0xff) << 24 |
30 ((slice[1] as u32) & 0xff) << 16 |
31 ((slice[2] as u32) & 0xff) << 8 |
32 ((slice[3] as u32) & 0xff)
33}
34
35
36impl<R> Deserializer<R> where R: Reader {
37 fn from_vec_reader(bytes: R) -> Deserializer<R> {
38 Deserializer{reader: bytes}
39 }
40
41 fn parse_value(&mut self) -> Value
42 {
43 let header_byte = self.reader.read_byte();
44 let major_type = bytes::major_type(header_byte);
45 let additional_type = bytes::additional_type(header_byte) as usize;
46
47 match major_type {
48 0b000 => self.deserialize_int(additional_type),
49 0b010 => self.deserialize_bytes(additional_type),
50 0b011 => self.deserialize_string(additional_type),
51 0b100 => self.deserialize_array(additional_type),
52 0b101 => self.deserialize_map(additional_type),
53 0b111 => self.deserialize_simple(additional_type),
54 _ => unreachable!(),
55 }
56 }
57
58 fn deserialize_int(&mut self, additional_type: usize) -> Value {
59 Value::Int(self.read_int(additional_type) as u32)
60 }
61
62 fn read_int(&mut self, additional_type: usize) -> usize {
63 match additional_type {
64 value @ 0b00000...0b10111 => value,
65 0b11000 => self.read_u8(),
66 0b11001 => self.read_u16(),
67 0b11010 => self.read_u32(),
68 _ => unreachable!(),
69 }
70 }
71
72 fn read_u8(&mut self) -> usize{
73 self.reader.read_byte() as usize
74 }
75
76 fn read_u16(&mut self) -> usize {
77 let bytes = self.reader.read_n_bytes(2);
78 u8_slice_to_u16(bytes.as_slice()) as usize
79 }
80
81 fn read_u32(&mut self) -> usize {
82 let bytes = self.reader.read_n_bytes(4);
83 u8_slice_to_u32(bytes.as_slice()) as usize
84 }
85
86 fn deserialize_bytes(&mut self, additional_type: usize) -> Value{
87 let len = self.read_int(additional_type);
88 Value::Bytes(self.reader.read_n_bytes(len as usize))
89 }
90
91 fn deserialize_string(&mut self, len: usize) -> Value {
92 bytes::to_string(&self.reader.read_n_bytes(len as usize))
93 }
94
95 fn deserialize_array(&mut self, additional_type: usize) -> Value {
96 let len = self.read_int(additional_type);
97 let values = (0..len).map(|_| self.parse_value()).collect();
98 Value::Array(values)
99 }
100
101 fn deserialize_map(&mut self, len: usize) -> Value {
102 let mut map = BTreeMap::new();
103
104 for _ in 0..len {
105 let key = self.parse_value().as_string().unwrap().clone();
106 let value = self.parse_value();
107
108 map.insert(key, value);
109 }
110
111 Value::Map(map)
112 }
113
114 fn deserialize_simple(&mut self, value: usize) -> Value {
115 match value {
116 22 => Value::Null,
117 _ => unreachable!(),
118 }
119 }
120}
121
122#[test]
123fn deserialize_map() {
124 let mut test_map = BTreeMap::new();
125 test_map.insert("key1".into(), Value::String("value1".into()));
126 test_map.insert("key2".into(), Value::String("value2".into()));
127 let expected: Value = Value::Map(test_map);
128 assert_eq!(expected, from_bytes(vec![0xa2, 0x64, 0x6b, 0x65, 0x79, 0x31, 0x66, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x31, 0x64, 0x6b, 0x65, 0x79, 0x32, 0x66, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x32]));
129}
130
131#[test]
132fn deserialize_string() {
133 let expected: Value = Value::String("test".into());
134 assert_eq!(expected, from_bytes(vec![0x64, 0x74, 0x65, 0x73, 0x74]));
135}
136
137#[test]
138fn deserialize_array() {
139 let expected: Value = Value::Array(vec![Value::Int(1), Value::Int(2), Value::Int(3)]);
140 assert_eq!(expected, from_bytes(vec![0x83, 0x01, 0x02, 0x03]));
141}
142
143#[test]
144fn deserialize_bytes() {
145 let expected: Value = Value::Bytes(vec![1, 2, 3]);
146 assert_eq!(expected, from_bytes(vec![0x43, 0x01, 0x02, 0x03]));
147}
148
149#[test]
150fn deserialize_bytes_2() {
151 let mut range = (0..32).collect::<Vec<u8>>();
152 let expected: Value = Value::Bytes(range.clone());
153 let mut bytes_prefix = vec![0x58, 0x20];
154 bytes_prefix.append(&mut range);
155 assert_eq!(expected, from_bytes(bytes_prefix));
156}
157
158#[test]
159fn deserialize_u8() {
160 let expected: Value = Value::Int(1);
161 assert_eq!(expected, from_bytes(vec![0x01]));
162}
163
164#[test]
165fn deserialize_u8_2() {
166 let expected: Value = Value::Int(42);
167 assert_eq!(expected, from_bytes(vec![24, 42]));
168}
169
170#[test]
171fn deserialize_u16() {
172 let expected: Value = Value::Int(0x100);
173 assert_eq!(expected, from_bytes(vec![25, 1, 0]));
174}
175
176#[test]
177fn deserialize_u32() {
178 let expected: Value = Value::Int(0x1000000);
179 assert_eq!(expected, from_bytes(vec![26, 1, 0, 0, 0]));
180}
181
182#[test]
183fn deserialize_null() {
184 let expected: Value = Value::Null;
185 assert_eq!(expected, from_bytes(vec![246]));
186}