byte_parser/
while_byte_fn.rs

1
2use crate::{
3	ParseIterator,
4	recorder::Recorder
5};
6
7#[derive(Debug)]
8pub struct WhileByteFn<'a, T, F> {
9	inner: &'a mut T,
10	f: F
11}
12
13impl<'a, T, F> WhileByteFn<'a, T, F> {
14	pub(super) fn new(inner: &'a mut T, f: F) -> Self {
15		Self {inner, f}
16	}
17}
18
19impl<'s, 'a, T, F> ParseIterator<'s> for WhileByteFn<'a, T, F>
20where
21	T: ParseIterator<'s>,
22	F: Fn(&u8) -> bool {
23
24	type PointInTime = T::PointInTime;
25
26	fn slice(&self) -> &'s [u8] {
27		self.inner.slice()
28	}
29
30	fn pit(&self) -> Self::PointInTime {
31		self.inner.pit()
32	}
33
34	fn restore_pit(&mut self, pit: Self::PointInTime) {
35		self.inner.restore_pit(pit)
36	}
37
38	fn advance(&mut self) -> Option<()> {
39		let f = &self.f;
40		let pit = self.inner.pit();
41		let b = self.inner.next()?;
42
43		if f(&b) {
44			Some(())
45		} else {
46			self.inner.restore_pit(pit);
47			None
48		}
49	}
50
51	fn recorder(&self) -> Option<&Recorder> {
52		self.inner.recorder()
53	}
54
55	#[inline]
56	unsafe fn is_valid_utf8() -> bool {
57		T::is_valid_utf8()
58	}
59
60}
61
62
63
64
65#[cfg(test)]
66mod tests {
67
68	use crate::*;
69
70	#[test]
71	fn test_while_byte_fn() {
72
73		let s = b"my str";
74
75		let mut parser = Parser::new( s );
76		let mut parser_while = parser.while_byte_fn( |&b| b != b' ' );
77
78		assert_eq!( b'm', parser_while.next().unwrap() );
79		assert_eq!( b'y', parser_while.next().unwrap() );
80		assert!( parser_while.next().is_none() );
81
82		let mut parser_while = parser.while_byte_fn( |&b| b != b' ' );
83		assert!( parser_while.next().is_none() );// because we are at the space it should return none
84
85		// skip space
86		parser.next().unwrap();
87
88		// now parse the rest
89		let mut parser_while = parser.while_byte_fn( |&b| b != b' ' );
90
91		assert_eq!( b's', parser_while.next().unwrap() );
92		assert_eq!( b't', parser_while.next().unwrap() );
93		assert_eq!( b'r', parser_while.next().unwrap() );
94		assert!( parser_while.next().is_none() );
95
96	}
97
98}