udled/
input.rs

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    /// Parse a
38    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    /// Eat a token
46    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}