1use constants::*;
2use bytes::bytes;
3use value::{Value};
4use io::{Writer, VecWriter};
5use std::mem::transmute;
6
7pub trait Serializer {
8 fn serialize_unsigned(&mut self, n: usize, major_type: u8);
9 fn serialize_bytes(&mut self, bytes: Vec<u8>);
10 fn serialize_seq(&mut self, len: usize);
11 fn serialize_map(&mut self, len: usize);
12 fn serialize_simple(&mut self, value: usize);
13 fn serialize_string(&mut self, string: &String);
14}
15
16pub trait Serialize {
17 fn serialize<S>(&mut self, serializer: &mut S) where S: Serializer;
18}
19
20pub struct VecSerializer<'a> {
21 pub writer: VecWriter<'a>,
22}
23
24pub fn to_bytes(mut value: Value) -> Vec<u8>
25{
26 let mut output = Vec::with_capacity(128);
27 value.serialize(
28 &mut VecSerializer::from_vec_writer(
29 VecWriter{
30 output: &mut output,
31 }
32 )
33 );
34 output
35}
36
37impl<'a> VecSerializer<'a> {
38 fn from_vec_writer(vec_writer: VecWriter) -> VecSerializer {
39 VecSerializer{writer: vec_writer}
40 }
41
42 fn encode_unsigned(&mut self, n: usize, major_type: u8) -> Vec<u8> {
43 match n {
44 n if n < MAX_U8 => self.encode_u8(n, major_type),
45 n if n < MAX_U16 => self.encode_u16(n, major_type),
46 n if n < MAX_U32 => self.encode_u32(n, major_type),
47 _ => unreachable!()
48 }
49 }
50
51 fn encode_u8(&self, value: usize, major_type: u8) -> Vec<u8> {
52 match value {
53 n @ 0 ... 23 => vec![bytes::concat(major_type, n as u8)],
54 n @ 24 ... MAX_U8 => vec![bytes::concat(major_type, 24), n as u8],
55 _ => unreachable!()
56 }
57 }
58
59 fn encode_u16(&self, value: usize, major_type: u8) -> Vec<u8> {
60 let mut header = vec![bytes::concat(major_type, 25)];
61 let mut value: Vec<u8> = unsafe {
62 transmute::<u16, [u8; 2]>((value as u16).to_be()).to_vec()
63 };
64 header.append(&mut value);
65 header
66 }
67
68 fn encode_u32(&self, value: usize, major_type: u8) -> Vec<u8> {
69 let mut header = vec![bytes::concat(major_type, 26)];
70 let mut value: Vec<u8> = unsafe {
71 transmute::<u32, [u8; 4]>((value as u32).to_be()).to_vec()
72 };
73 header.append(&mut value);
74 header
75 }
76}
77
78impl<'a> Serializer for VecSerializer<'a> {
79 fn serialize_unsigned(&mut self, n: usize, major_type: u8) {
80 let bytes = self.encode_unsigned(n, major_type).to_vec();
81 self.writer.write_bytes(bytes);
82 }
83
84 fn serialize_bytes(&mut self, bytes: Vec<u8>) {
85 self.serialize_unsigned(bytes.len(), 0b010);
86 self.writer.write_bytes(bytes);
87 }
88
89 fn serialize_string(&mut self, string: &String) {
90 self.serialize_unsigned(string.len(), 0b011);
91 self.writer.write_bytes(string.as_bytes().to_vec());
92 }
93
94 fn serialize_seq(&mut self, len: usize) {
95 self.serialize_unsigned(len, 0b100);
96 }
97
98 fn serialize_map(&mut self, len: usize) {
99 self.serialize_unsigned(len, 0b101);
100 }
101
102 fn serialize_simple(&mut self, value: usize) {
103 self.serialize_unsigned(value, 0b111);
104 }
105}
106
107#[test]
108fn serialize_map() {
109 let mut test_map = BTreeMap::new();
110 test_map.insert("key1".into(), Value::String("value1".into()));
111 test_map.insert("key2".into(), Value::String("value2".into()));
112 let value: Value = Value::Map(test_map);
113 assert_eq!(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], to_bytes(value));
114}
115
116#[test]
117fn serialize_array() {
118 let value = Value::Array(vec![Value::Int(1), Value::Int(2), Value::Int(3)]);
119 assert_eq!(vec![131, 1, 2, 3], to_bytes(value));
120}
121
122#[test]
123fn serialize_string() {
124 let value = Value::String("test".into());
125 assert_eq!(vec![0x64, 0x74, 0x65, 0x73, 0x74], to_bytes(value));
126}
127
128#[test]
129fn serialize_u16() {
130 let value = Value::Int(0x100);
131 assert_eq!(vec![25, 1, 0], to_bytes(value));
132}
133
134#[test]
135fn serialize_u32() {
136 let value = Value::Int(0x1000000);
137 assert_eq!(vec![26, 1, 0, 0, 0], to_bytes(value));
138}
139
140#[test]
141fn serialize_u8() {
142 let value = Value::Int(2);
143 assert_eq!(vec![2], to_bytes(value));
144}
145
146#[test]
147fn serialize_u8_2() {
148 let value = Value::Int(42);
149 assert_eq!(vec![24, 42], to_bytes(value));
150}
151
152#[test]
153fn serialize_null() {
154 let value = Value::Null;
155 assert_eq!(vec![246], to_bytes(value));
156}