lexer/
read.rs

1use super::{Input, ReaderResult, Readers, State};
2
3#[inline]
4pub fn read<T, E>(
5  readers: &Readers<T, E>,
6  input: &mut dyn Input,
7  state: &mut State,
8) -> Option<Result<T, E>> {
9  if input.is_done(state) {
10    None
11  } else {
12    let mut token = None;
13    let mut new_state = None;
14    let mut is_empty = false;
15    let orig_state = state.clone();
16
17    for reader in readers.iter() {
18      let mut next_state = orig_state.clone();
19
20      match reader.read(readers, input, &orig_state, &mut next_state) {
21        ReaderResult::Some(t) => {
22          token = Some(Ok(t));
23          new_state = Some(next_state);
24          break;
25        }
26        ReaderResult::Err(e) => {
27          return Some(Err(e));
28        }
29        ReaderResult::Empty => {
30          new_state = Some(next_state);
31          is_empty = true;
32          break;
33        }
34        ReaderResult::None => (),
35      }
36    }
37
38    if let Some(s) = new_state {
39      state.clone_from(&s);
40    }
41
42    if is_empty {
43      read(readers, input, state)
44    } else {
45      debug_assert!(
46        orig_state.index() != state.index() || input.is_done(&state),
47        "No reader was able to read at {:?}",
48        orig_state
49      );
50      token
51    }
52  }
53}