zero_formatter/
sequence.rs

1use error::*;
2use formatter::*;
3use util;
4
5use std::io::Seek;
6use byteorder::{ReadBytesExt, WriteBytesExt};
7use std::borrow::Cow;
8
9fn try_deserialize<R, A>(s: &mut R, n: i32, v: &mut Vec<A>, offset: &mut u64) -> ZeroFormatterResult<()>
10    where R: Seek + ReadBytesExt + WriteBytesExt + Formatter<A> {
11    if n < 0 {
12      Ok(())
13    } else {
14      let a = try!(s.deserialize(offset));
15      v.push(a);
16      try_deserialize(s, n - 1, v, offset)
17    }
18}
19
20impl<'a, R, A: Clone> Formatter<Cow<'a, [A]>> for R
21    where R: Seek + ReadBytesExt + WriteBytesExt + Formatter<A> + Formatter<i32> {
22
23    fn serialize(&mut self, offset: u64, value: Cow<'a, [A]>) -> ZeroFormatterResult<i32> {
24        let v: Vec<A> = value.into_owned();
25        let lr = try!(self.serialize(offset, v.len() as i32));
26        let byte_size = try!(v.iter().fold(
27            Ok(lr),
28            |b, a| {
29                b.and_then(|bs| {
30                    self.serialize(offset + (bs as u64), a.clone())
31                        .map(|s| bs + s)
32                })
33            }
34        ));
35        Ok(byte_size as i32)
36    }
37
38    fn deserialize(&mut self, offset: &mut u64) -> ZeroFormatterResult<Cow<'a, [A]>> {
39        let l: i32 = try!(util::check_non_null(self, offset));
40        let mut v: Vec<A> = Vec::with_capacity(l as usize);
41        try!(try_deserialize(self, l - 1, &mut v, offset));
42        Ok(Cow::from(v))
43    }
44}
45
46#[cfg(test)]
47mod tests {
48
49    use std::io::Cursor;
50    use std::borrow::Cow;
51    use std::io::{Seek, SeekFrom};
52    use error::*;
53    use formatter::*;
54    use util;
55
56    #[test]
57    fn serialize_vec() {
58        let mut wtr = Cursor::new(Vec::new());
59        assert_eq!(wtr.serialize(0, Cow::from(vec![1i32, 2i32, 3i32])).unwrap(), 16);
60        assert_eq!(wtr.into_inner(), vec![3, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0]);
61    }
62
63    #[test]
64    fn deserialize_vec() {
65        let mut rdr = Cursor::new(vec![3, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0]);
66        let mut offset = 0;
67        let actual: Cow<'static, [i32]> = rdr.deserialize(&mut offset).unwrap();
68        assert_eq!(offset, 16);
69        assert_eq!(Cow::from(vec![1, 2, 3]), actual);
70    }
71
72    struct_formatter! {
73        #[target(Cursor<Vec<u8>>)]
74        S {
75            a: i32
76        }
77    }
78
79    #[test]
80    fn serialize_vec_struct() {
81        let mut wtr = Cursor::new(Vec::new());
82        assert_eq!(wtr.serialize(0, Cow::from(vec![S{a: 1}, S{a: 2}, S{a: 3}])).unwrap(), 16);
83        assert_eq!(wtr.into_inner(), vec![3, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0]);
84    }
85
86    #[test]
87    fn deserialize_vec_struct() {
88        let mut rdr = Cursor::new(vec![3, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0]);
89        let mut offset = 0;
90        let actual: Cow<'static, [S]> = rdr.deserialize(&mut offset).unwrap();
91        assert_eq!(offset, 16);
92        assert_eq!(Cow::from(vec![S{a: 1}, S{a: 2}, S{a: 3}]), actual);
93    }
94
95    object_formatter! {
96        #[target(Cursor<Vec<u8>>)]
97        O {
98            0; a: i32
99        }
100    }
101
102    #[test]
103    fn serialize_vec_object() {
104        let mut wtr = Cursor::new(Vec::new());
105        assert_eq!(wtr.serialize(0, Cow::from(vec![O{a: 1}, O{a: 2}, O{a: 3}])).unwrap(), 52);
106        let expected = vec![
107            3, 0, 0, 0,
108
109            16, 0, 0, 0,
110            0, 0, 0, 0,
111            16, 0, 0, 0,
112            1, 0, 0, 0,
113
114            16, 0, 0, 0,
115            0, 0, 0, 0,
116            32, 0, 0, 0,
117            2, 0, 0, 0,
118
119            16, 0, 0, 0,
120            0, 0, 0, 0,
121            48, 0, 0, 0,
122            3, 0, 0, 0,
123        ];
124        assert_eq!(wtr.into_inner(), expected);
125    }
126
127    #[test]
128    fn deserialize_vec_object() {
129        let mut rdr = Cursor::new(vec![
130            3, 0, 0, 0,
131
132            16, 0, 0, 0,
133            0, 0, 0, 0,
134            16, 0, 0, 0,
135            1, 0, 0, 0,
136
137            16, 0, 0, 0,
138            0, 0, 0, 0,
139            32, 0, 0, 0,
140            2, 0, 0, 0,
141
142            16, 0, 0, 0,
143            0, 0, 0, 0,
144            48, 0, 0, 0,
145            3, 0, 0, 0,
146        ]);
147        let mut offset = 0;
148        let actual: Cow<'static, [O]> = rdr.deserialize(&mut offset).unwrap();
149        assert_eq!(offset, 52);
150        assert_eq!(Cow::from(vec![O{a: 1}, O{a: 2}, O{a: 3}]), actual);
151    }
152}