nanvm_lib/parser/
json_state.rs1use 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 JsonState<M>,
24 Option<(String, 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 (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}