Skip to main content

harn_parser/parser/
error.rs

1use harn_lexer::Span;
2use std::fmt;
3
4/// Parser errors.
5#[derive(Debug, Clone, PartialEq, Eq)]
6pub enum ParserError {
7    Unexpected {
8        got: String,
9        expected: String,
10        span: Span,
11    },
12    UnexpectedEof {
13        expected: String,
14        span: Span,
15    },
16}
17
18impl ParserError {
19    /// The source span the error points at.
20    #[must_use]
21    pub fn span(&self) -> Span {
22        match self {
23            ParserError::Unexpected { span, .. } | ParserError::UnexpectedEof { span, .. } => *span,
24        }
25    }
26}
27
28impl fmt::Display for ParserError {
29    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
30        match self {
31            ParserError::Unexpected {
32                got,
33                expected,
34                span,
35            } => write!(
36                f,
37                "Expected {expected}, got {got} at {}:{}",
38                span.line, span.column
39            ),
40            ParserError::UnexpectedEof { expected, .. } => {
41                write!(f, "Unexpected end of file, expected {expected}")
42            }
43        }
44    }
45}
46
47impl std::error::Error for ParserError {}