use std::fmt;
use crate::span::Span;
#[derive(Debug, Clone)]
pub struct Error {
message: String,
span: Span,
}
impl Error {
pub fn new<T: fmt::Display>(span: Span, message: T) -> Self {
Error {
message: message.to_string(),
span,
}
}
pub(crate) fn expected_token(span: Span, expected: &str) -> Self {
Error {
message: format!("expected {}", expected),
span,
}
}
pub fn span(&self) -> Span {
self.span
}
pub fn message(&self) -> &str {
&self.message
}
}
impl fmt::Display for Error {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
let loc = self.span.start();
write!(f, "error at byte offset {}: {}", loc, self.message)
}
}
impl std::error::Error for Error {}
pub type Result<T> = std::result::Result<T, Error>;