byte_parser/
while_byte_fn.rs1
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() );parser.next().unwrap();
87
88 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}