zero_formatter/
option.rs

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}