use std::fmt;
use crate::text::{LineIndex, TextRange};
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct SyntaxError {
range: TextRange,
message: String,
}
impl SyntaxError {
#[must_use]
pub fn new(range: TextRange, message: impl Into<String>) -> Self {
Self {
range,
message: message.into(),
}
}
#[must_use]
pub fn range(&self) -> TextRange {
self.range
}
#[must_use]
pub fn message(&self) -> &str {
&self.message
}
#[must_use]
pub fn display_with(&self, index: &LineIndex) -> String {
format!("{}: {}", index.line_col(self.range.start()), self.message)
}
}
impl fmt::Display for SyntaxError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "{}: {}", self.range, self.message)
}
}
impl std::error::Error for SyntaxError {}