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