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}