byte_parser/
ignore_byte.rs1
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();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}