use std::fmt;
use crate::scanner::Pos;
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct Error {
pub message: String,
pub line: usize,
pub col: usize,
}
impl Error {
pub(crate) fn at(message: impl Into<String>, pos: Pos) -> Self {
Error {
message: message.into(),
line: pos.line,
col: pos.col,
}
}
pub(crate) fn unpositioned(message: impl Into<String>) -> Self {
Error {
message: message.into(),
line: 0,
col: 0,
}
}
}
impl fmt::Display for Error {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
if self.line > 0 {
write!(f, "Error: {} ({}:{})", self.message, self.line, self.col)
} else {
write!(f, "Error: {}", self.message)
}
}
}
impl std::error::Error for Error {}