use std::fmt;
use crate::scanner::Pos;
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct Error {
pub message: String,
pub line: usize,
pub col: usize,
pub(crate) length: usize,
pub(crate) rendered: Option<String>,
}
impl Error {
pub(crate) fn at(message: impl Into<String>, pos: Pos) -> Self {
Error {
message: message.into(),
line: pos.line,
col: pos.col,
length: 0,
rendered: None,
}
}
pub(crate) fn unpositioned(message: impl Into<String>) -> Self {
Error {
message: message.into(),
line: 0,
col: 0,
length: 0,
rendered: None,
}
}
pub(crate) fn with_length(mut self, length: usize) -> Self {
if self.length == 0 {
self.length = length;
}
self
}
pub(crate) fn has_position(&self) -> bool {
self.line > 0
}
}
impl fmt::Display for Error {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
if let Some(r) = &self.rendered {
return f.write_str(r);
}
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 {}