oni_comb_parser/
str_input.rs1use crate::input::Input;
2
3pub struct StrInput<'a> {
4 src: &'a str,
5 offset: usize,
6}
7
8impl<'a> StrInput<'a> {
9 pub fn new(src: &'a str) -> Self {
10 Self { src, offset: 0 }
11 }
12
13 pub(crate) fn advance(&mut self, n: usize) {
14 self.offset += n;
15 }
16
17 pub(crate) fn as_str(&self) -> &'a str {
18 &self.src[self.offset..]
19 }
20
21 #[inline]
23 pub fn peek_byte(&self) -> Option<u8> {
24 self.src.as_bytes().get(self.offset).copied()
25 }
26}
27
28impl<'a> Input for StrInput<'a> {
29 type Checkpoint = usize;
30 type Slice = &'a str;
31 type Token = char;
32
33 #[inline]
34 fn next_token(&mut self) -> Option<char> {
35 let c = self.as_str().chars().next()?;
36 self.offset += c.len_utf8();
37 Some(c)
38 }
39
40 #[inline]
41 fn peek_token(&self) -> Option<char> {
42 self.as_str().chars().next()
43 }
44
45 #[inline]
46 fn slice_since(&self, cp: usize) -> &'a str {
47 &self.src[cp..self.offset]
48 }
49
50 fn checkpoint(&self) -> Self::Checkpoint {
51 self.offset
52 }
53
54 fn reset(&mut self, checkpoint: Self::Checkpoint) {
55 self.offset = checkpoint;
56 }
57
58 fn offset(&self) -> usize {
59 self.offset
60 }
61
62 fn remaining(&self) -> &'a str {
63 &self.src[self.offset..]
64 }
65
66 fn is_eof(&self) -> bool {
67 self.offset >= self.src.len()
68 }
69}