#[macro_export]
macro_rules! object {
(
let decoder = $dec:ident;
let buffer = $buf:expr;
$T:ident {
$($name:ident: $modus:ident. $key:expr => $action:expr),+
}
) => {{
$dec.object1(|$dec| {
$(let mut $name = None;)+
loop {
$buf.reset();
try!($dec.key_str($buf, false));
match $buf.as_str() {
$($key => {
let v = try!($dec.value($action));
$name = Some(v.value);
if v.is_last {
break
}
})+
_ => {
let v = try!($dec.value(Decoder::skip));
if v.is_last {
break
}
}
}
}
Ok($T {
$($name: to_field!($key, $name, $modus),)+
})
})
}};
(
let decoder = $dec:ident;
$T:ident {
$($name:ident: $modus:ident. $key:expr => $action:expr),+
}
) => {{
$dec.object1(|$dec| {
$(let mut $name = None;)+
loop {
match try!($dec.key()).as_ref() {
$($key => {
let v = try!($dec.value($action));
$name = Some(v.value);
if v.is_last {
break
}
})+
_ => {
let v = try!($dec.value(Decoder::skip));
if v.is_last {
break
}
}
}
}
Ok($T {
$($name: to_field!($key, $name, $modus),)+
})
})
}}
}
#[macro_export]
macro_rules! to_field {
($msg:expr, $e:expr, opt) => {
match $e {
Some(e) => e,
None => None
}
};
($msg:expr, $e:expr, req) => {
match $e {
Some(e) => e,
None => return Err(DecodeError::Expected($msg))
}
}
}
#[macro_export]
macro_rules! array {
($dec:ident, $e:expr) => {{
let mut v = Vec::new();
for x in try!($dec.array_iter($e)) {
v.push(try!(x))
}
Ok(v)
}};
($e:expr) => {{ |dec| {
let mut v = Vec::new();
for x in try!(dec.array_iter($e)) {
v.push(try!(x))
}
Ok(v)
}}}
}