use harn_lexer::Span;
use std::fmt;
pub const REMOVED_RANGE_KEYWORD: &str = "to";
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum ParserError {
Unexpected {
got: String,
expected: String,
span: Span,
},
UnexpectedEof {
expected: String,
span: Span,
},
RemovedRangeSyntax {
span: Span,
},
}
impl ParserError {
#[must_use]
pub fn span(&self) -> Span {
match self {
ParserError::Unexpected { span, .. }
| ParserError::UnexpectedEof { span, .. }
| ParserError::RemovedRangeSyntax { span } => *span,
}
}
}
impl fmt::Display for ParserError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
ParserError::Unexpected {
got,
expected,
span,
} => write!(
f,
"Expected {expected}, got {got} at {}:{}",
span.line, span.column
),
ParserError::UnexpectedEof { expected, .. } => {
write!(f, "Unexpected end of file, expected {expected}")
}
ParserError::RemovedRangeSyntax { span } => write!(
f,
"`{REMOVED_RANGE_KEYWORD}` ranges were removed; write `start..=end` (or `start..end` for `exclusive`) at {}:{}",
span.line, span.column
),
}
}
}
impl std::error::Error for ParserError {}