///! Utility macros macro_rules! next { ($bytes:ident) => ({ match $bytes.next() { Some(b) => b, None => return Ok(Status::Partial) } }) } macro_rules! expect { ($bytes:ident.next() == $pat:pat => $ret:expr) => { expect!(next!($bytes) => $pat |? $ret) }; ($e:expr => $pat:pat |? $ret:expr) => { match $e { v@$pat => v, _ => return $ret } }; } macro_rules! complete { ($e:expr) => { match $e? { Status::Complete(v) => v, Status::Partial => return Ok(Status::Partial) } } } macro_rules! byte_map { ($($flag:expr,)*) => ([ $($flag != 0,)* ]) } macro_rules! space { ($bytes:ident or $err:expr) => ({ expect!($bytes.next() == b' ' => Err($err)); $bytes.slice(); }) } macro_rules! newline { ($bytes:ident) => ({ match next!($bytes) { b'\r' => { expect!($bytes.next() == b'\n' => Err(Error::NewLine)); $bytes.slice(); }, b'\n' => { $bytes.slice(); }, _ => return Err(Error::NewLine) } }) }