httparse/
macros.rs
1macro_rules! next {
4 ($bytes:ident) => ({
5 match $bytes.next() {
6 Some(b) => b,
7 None => return Ok(Status::Partial)
8 }
9 })
10}
11
12macro_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
24macro_rules! complete {
25 ($e:expr) => {
26 match $e? {
27 Status::Complete(v) => v,
28 Status::Partial => return Ok(Status::Partial)
29 }
30 }
31}
32
33macro_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
48macro_rules! space {
49 ($bytes:ident or $err:expr) => ({
50 expect!($bytes.next() == b' ' => Err($err));
51 $bytes.slice();
52 })
53}
54
55macro_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}