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