httparse/
macros.rs

1//! Utility macros
2
3macro_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}