use std::fmt;
use {
TokenType,
};
#[derive(Fail, Debug)]
pub enum Error {
#[fail(display = "invalid token '{}' at {}", _0, _1)]
InvalidToken(TokenType, ErrorPos),
#[fail(display = "invalid token '{}' at {} cause {}", _0, _1, _2)]
InvalidTokenWithCause(TokenType, ErrorPos, StreamError),
#[fail(display = "unexpected token '{}' at {}", _0, _1)]
UnexpectedToken(TokenType, ErrorPos),
#[fail(display = "unknown token at {}", _0)]
UnknownToken(ErrorPos),
}
pub type Result<T> = ::std::result::Result<T, Error>;
#[derive(Fail, Debug)]
pub enum StreamError {
#[fail(display = "unexpected end of stream")]
UnexpectedEndOfStream,
#[fail(display = "invalid name token")]
InvalidName,
#[fail(display = "expected '{}' not '{}' at {}", _1, _0, _2)]
InvalidChar(char, String, ErrorPos),
#[fail(display = "invalid reference")]
InvalidReference,
#[fail(display = "invalid ExternalID")]
InvalidExternalID,
}
#[derive(Clone, Copy, PartialEq, Debug)]
#[allow(missing_docs)]
pub struct ErrorPos {
pub row: usize,
pub col: usize,
}
impl ErrorPos {
pub fn new(row: usize, col: usize) -> ErrorPos {
ErrorPos { row, col }
}
}
impl fmt::Display for ErrorPos {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "{}:{}", self.row, self.col)
}
}