1use crate::{buffer::IntoBuffer, cursor::Cursor, Buffer, Reader, Result, Tokenizer};
2
3pub struct Input<B> {
4 buffer: B,
5 index: usize,
6}
7
8impl Input<()> {
9 pub fn new<'a, B: IntoBuffer<'a>>(buffer: B) -> Input<B::Buffer> {
10 Input {
11 buffer: buffer.into_buffer(),
12 index: 0,
13 }
14 }
15}
16
17impl<B> Input<B> {
18 pub fn buffer(&self) -> &B {
19 &self.buffer
20 }
21
22 #[inline(always)]
23 fn reader<'this, 'input>(&'this mut self) -> Reader<'this, 'input, B>
24 where
25 B: Buffer<'input>,
26 {
27 Reader::new(Cursor::new(&mut self.index, &mut self.buffer))
28 }
29
30 pub fn is<'input, T: Tokenizer<'input, B>>(&mut self, tokenizer: T) -> bool
31 where
32 B: Buffer<'input>,
33 {
34 self.reader().is(tokenizer)
35 }
36
37 pub fn parse<'input, T: Tokenizer<'input, B>>(&mut self, tokenizer: T) -> Result<T::Token>
39 where
40 B: Buffer<'input>,
41 {
42 self.reader().parse(tokenizer)
43 }
44
45 pub fn eat<'input, T: Tokenizer<'input, B>>(&mut self, tokenizer: T) -> Result<()>
47 where
48 B: Buffer<'input>,
49 {
50 self.reader().eat(tokenizer)
51 }
52}