• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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     ($($p:pat)|+) => {{
35         const fn make_map() -> [bool; 256] {
36             let mut ret = [false; 256];
37             let mut i = 0;
38             while i < 256 {
39                 ret[i] = matches!(i as u8, $($p)|+);
40                 i += 1;
41             }
42             ret
43         }
44         make_map()
45     }}
46 }
47 
48 macro_rules! space {
49     ($bytes:ident or $err:expr) => ({
50         expect!($bytes.next() == b' ' => Err($err));
51         $bytes.slice();
52     })
53 }
54 
55 macro_rules! newline {
56     ($bytes:ident) => ({
57         match next!($bytes) {
58             b'\r' => {
59                 expect!($bytes.next() == b'\n' => Err(Error::NewLine));
60                 $bytes.slice();
61             },
62             b'\n' => {
63                 $bytes.slice();
64             },
65             _ => return Err(Error::NewLine)
66         }
67     })
68 }
69