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

}