Skip to main content

oni_comb_parser/
str_input.rs

1use 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  /// 次のバイトを消費せずに覗く。EOF なら `None`。
22  #[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}