cbor_lite/
ser.rs

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}