1#[macro_export]
2macro_rules! option_formatter {
3 (#[target($buffer:ty)]
4 $name:ident
5 ) => (
6 impl Formatter<Option<$name>> for $buffer {
7
8 fn serialize(&mut self, offset: u64, value: Option<$name>) -> ZeroFormatterResult<i32> {
9 try!(self.seek(SeekFrom::Start(offset)));
10 match value {
11 None => {
12 self.serialize(offset, -1i32)
13 },
14 Some(v) => {
15 self.serialize(offset, v)
16 }
17 }
18 }
19
20 fn deserialize(&mut self, offset: &mut u64) -> ZeroFormatterResult<Option<$name>> {
21 let len: i32 = try!(self.deserialize(offset));
22 if len == -1 {
23 Ok(None)
24 }
25 else if len < -1 {
26 ZeroFormatterError::invalid_binary(*offset)
27 }
28 else {
29 *offset -= 4;
30 self.deserialize(offset).map(|v| Some(v))
31 }
32 }
33 }
34 )
35}