1 //! Utility macros
2 
3 macro_rules! next {
4     ($bytes:ident) => ({
5         match $bytes.next() {
6             Some(b) => b,
7             None => return Ok(Status::Partial)
8         }
9     })
10 }
11 
12 macro_rules! expect {
13     ($bytes:ident.next() == $pat:pat => $ret:expr) => {
14         expect!(next!($bytes) => $pat |? $ret)
15     };
16     ($e:expr => $pat:pat |? $ret:expr) => {
17         match $e {
18             v@$pat => v,
19             _ => return $ret
20         }
21     };
22 }
23 
24 macro_rules! complete {
25     ($e:expr) => {
26         match $e? {
27             Status::Complete(v) => v,
28             Status::Partial => return Ok(Status::Partial)
29         }
30     }
31 }
32 
33 macro_rules! byte_map {
34     ($($flag:expr,)*) => ([
35         $($flag != 0,)*
36     ])
37 }
38 
39 macro_rules! space {
40     ($bytes:ident or $err:expr) => ({
41         expect!($bytes.next() == b' ' => Err($err));
42         $bytes.slice();
43     })
44 }
45 
46 macro_rules! newline {
47     ($bytes:ident) => ({
48         match next!($bytes) {
49             b'\r' => {
50                 expect!($bytes.next() == b'\n' => Err(Error::NewLine));
51                 $bytes.slice();
52             },
53             b'\n' => {
54                 $bytes.slice();
55             },
56             _ => return Err(Error::NewLine)
57         }
58     })
59 }
60