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 | |