1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
type ExpResult<T> = Result<T, Option<u8>>; pub trait ExpectByte: Sized { fn expect_byte_fn<F>(self, f: F) -> ExpResult<Self> where F: Fn(u8) -> bool; #[inline] fn expect_byte(self, byte: u8) -> ExpResult<Self> { self.expect_byte_fn(|b| b == byte) } } impl ExpectByte for Option<u8> { #[inline] fn expect_byte_fn<F>(self, f: F) -> ExpResult<Self> where F: Fn(u8) -> bool { match self { Some(b) if f(b) => Ok(self), _ => Err(self) } } } impl ExpectByte for u8 { #[inline] fn expect_byte_fn<F>(self, f: F) -> ExpResult<Self> where F: Fn(u8) -> bool { match f(self) { true => Ok(self), false => Err(Some(self)) } } }