eventson 0.1.0

An event based JSON parser with competitive performance
Documentation
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)
    }
}

// TODO: Split into a lex and parse error?
#[derive(Debug, PartialEq)]
pub enum InvalidInput {
    InvalidEscape(u8),
    InvalidHighSurrogate(u32),
    InvalidLowSurrogate(u32),
    MissingLowSurrogate(u32),
    InvalidEscapeSequence(u8, u8, u8, u8),
    // TODO: Should we mask this inner type?
    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, // Position is not available in lexical::Error
            input: InvalidInput::InvalidNumber(Some(err)),
        }
    }
}

impl From<std::io::Error> for Error {
    fn from(err: std::io::Error) -> Self {
        Error::Io(err)
    }
}