use super::{
any_state::AnyState,
const_state::ConstState,
root_state::RootState,
shared::{ParseError, ParseResult},
};
use crate::{mem::manager::Manager, tokenizer::JsonToken};
pub enum JsonState<M: Manager> {
ParseRoot(RootState<M>),
ParseConst(ConstState<M>),
ParseModule(AnyState<M>),
Result(ParseResult<M::Dealloc>),
Error(ParseError),
}
impl<M: Manager> JsonState<M> {
pub fn push(
self,
manager: M,
token: JsonToken<M::Dealloc>,
) -> (
/*json_state:*/ JsonState<M>,
/*import:*/ Option<(/*id:*/ String, /*module:*/ String)>,
) {
if let JsonToken::NewLine = token {
return match self {
JsonState::ParseRoot(state) => state.parse(manager, token),
_ => (self, None),
};
}
match self {
JsonState::ParseRoot(state) => state.parse(manager, token),
JsonState::ParseConst(state) => (state.parse(manager, token), None),
JsonState::Result(_) => (JsonState::Error(ParseError::UnexpectedToken), None),
JsonState::ParseModule(state) => {
let (json_state, _module_name) = state.parse_for_module(manager, token);
(json_state, None)
}
_ => (self, None),
}
}
pub fn end(self) -> Result<ParseResult<M::Dealloc>, ParseError> {
match self {
JsonState::Result(result) => Ok(result),
JsonState::Error(error) => Err(error),
_ => Err(ParseError::UnexpectedEnd),
}
}
}