nanvm_lib/parser/
json_state.rs

1use super::{
2    any_state::AnyState,
3    const_state::ConstState,
4    root_state::RootState,
5    shared::{ParseError, ParseResult},
6};
7use crate::{mem::manager::Manager, tokenizer::JsonToken};
8
9pub enum JsonState<M: Manager> {
10    ParseRoot(RootState<M>),
11    ParseConst(ConstState<M>),
12    ParseModule(AnyState<M>),
13    Result(ParseResult<M::Dealloc>),
14    Error(ParseError),
15}
16
17impl<M: Manager> JsonState<M> {
18    pub fn push(
19        self,
20        manager: M,
21        token: JsonToken<M::Dealloc>,
22    ) -> (
23        /*json_state:*/ JsonState<M>,
24        /*import:*/ Option<(/*id:*/ String, /*module:*/ String)>,
25    ) {
26        if let JsonToken::NewLine = token {
27            return match self {
28                JsonState::ParseRoot(state) => state.parse(manager, token),
29                _ => (self, None),
30            };
31        }
32        match self {
33            JsonState::ParseRoot(state) => state.parse(manager, token),
34            JsonState::ParseConst(state) => (state.parse(manager, token), None),
35            JsonState::Result(_) => (JsonState::Error(ParseError::UnexpectedToken), None),
36            JsonState::ParseModule(state) => {
37                let (json_state, _module_name) = state.parse_for_module(manager, token);
38                // TODO: figure out id and use _module_name to return Some in place of None below.
39                (json_state, None)
40            }
41            _ => (self, None),
42        }
43    }
44
45    pub fn end(self) -> Result<ParseResult<M::Dealloc>, ParseError> {
46        match self {
47            JsonState::Result(result) => Ok(result),
48            JsonState::Error(error) => Err(error),
49            _ => Err(ParseError::UnexpectedEnd),
50        }
51    }
52}