byte_parser/
ignore_byte.rs

1
2use crate::{
3	ParseIterator,
4	recorder::Recorder
5};
6
7
8#[derive(Debug)]
9pub struct IgnoreByte<'a, T> {
10	inner: &'a mut T,
11	byte: u8
12}
13
14impl<'a, T> IgnoreByte<'a, T> {
15	pub(super) fn new(inner: &'a mut T, byte: u8) -> Self {
16		Self {inner, byte}
17	}
18}
19
20impl<'s, 'a, T> ParseIterator<'s> for IgnoreByte<'a, T>
21where T: ParseIterator<'s> {
22
23	type PointInTime = T::PointInTime;
24
25	fn slice(&self) -> &'s [u8] {
26		self.inner.slice()
27	}
28
29	fn pit(&self) -> Self::PointInTime {
30		self.inner.pit()
31	}
32
33	fn restore_pit(&mut self, pit: Self::PointInTime) {
34		self.inner.restore_pit( pit )
35	}
36
37	fn advance(&mut self) -> Option<()> {
38		let byte = self.byte;
39		self.inner
40			.while_byte_fn(|&b| b == byte)
41			.consume();// consume
42		self.inner.advance()
43	}
44
45	fn recorder(&self) -> Option<&Recorder> {
46		self.inner.recorder()
47	}
48
49	#[inline]
50	unsafe fn is_valid_utf8() -> bool {
51		T::is_valid_utf8()
52	}
53
54}
55
56
57
58#[cfg(test)]
59mod tests {
60
61	use crate::*;
62
63	#[test]
64	fn test_ignore_byte() {
65
66		let s = b"my byte str";
67
68		let mut parser = Parser::new( s );
69		let mut parser = parser.ignore_byte(b' ');
70
71		for b in s.iter() {
72			if *b == b' ' {
73				continue
74			}
75			assert_eq!( *b, parser.next().unwrap() );
76		}
77
78		assert_eq!( None, parser.next() );
79
80	}
81
82}