1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#[macro_export]
macro_rules! option_formatter {
    (#[target($buffer:ty)]
    $name:ident
    ) => (
        impl Formatter<Option<$name>> for $buffer {

            fn serialize(&mut self, offset: u64, value: Option<$name>) -> ZeroFormatterResult<i32> {
                try!(self.seek(SeekFrom::Start(offset)));
                match value {
                    None => {
                        self.serialize(offset, -1i32)
                    },
                    Some(v) => {
                        self.serialize(offset, v)
                    }
                }
            }

            fn deserialize(&mut self, offset: &mut u64) -> ZeroFormatterResult<Option<$name>> {
                let len: i32 = try!(self.deserialize(offset));
                if len == -1 {
                    Ok(None)
                }
                else if len < -1 {
                    ZeroFormatterError::invalid_binary(*offset)
                }
                else {
                    *offset -= 4;
                    self.deserialize(offset).map(|v| Some(v))
                }
            }
        }
    )
}