use std::fmt::Display;
pub type Result<T> = std::result::Result<T, Error>;
#[derive(Debug)]
pub enum Error {
Io(std::io::Error),
TokenTooLarge,
InvalidInput { position: u64, input: InvalidInput },
MaximumDepthExceeded,
}
impl std::error::Error for Error {}
impl Display for Error {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "{:?}", self)
}
}
#[derive(Debug, PartialEq)]
pub enum InvalidInput {
InvalidEscape(u8),
InvalidHighSurrogate(u32),
InvalidLowSurrogate(u32),
MissingLowSurrogate(u32),
InvalidEscapeSequence(u8, u8, u8, u8),
InvalidNumber(Option<lexical::Error>),
InvalidTokenStart(u8),
ControlCharacterInString(u8),
UnescapedString,
UnterminatedString,
InvalidLiteral,
WrongTokenForContext,
EmptyStack,
UnexpectedEof,
}
impl InvalidInput {
pub fn err(self, pos: u64) -> Error {
Error::InvalidInput {
position: pos,
input: self,
}
}
pub fn res<T>(self, pos: u64) -> Result<T> {
Err(Error::InvalidInput {
position: pos,
input: self,
})
}
}
impl From<lexical::Error> for Error {
fn from(err: lexical::Error) -> Self {
Error::InvalidInput {
position: 0, input: InvalidInput::InvalidNumber(Some(err)),
}
}
}
impl From<std::io::Error> for Error {
fn from(err: std::io::Error) -> Self {
Error::Io(err)
}
}