Skip to main content

tla_syntax/
error.rs

1use std::fmt;
2
3pub type Result<T> = std::result::Result<T, Error>;
4
5#[derive(Debug, Clone, PartialEq, Eq)]
6pub struct Error {
7    pub stage: Stage,
8    pub message: String,
9    pub line: u32,
10    pub col: u32,
11}
12
13#[derive(Debug, Clone, Copy, PartialEq, Eq)]
14pub enum Stage {
15    Lex,
16    Parse,
17}
18
19impl Error {
20    pub fn lex(message: impl Into<String>, line: u32, col: u32) -> Self {
21        Self {
22            stage: Stage::Lex,
23            message: message.into(),
24            line,
25            col,
26        }
27    }
28
29    pub fn parse(message: impl Into<String>, line: u32, col: u32) -> Self {
30        Self {
31            stage: Stage::Parse,
32            message: message.into(),
33            line,
34            col,
35        }
36    }
37}
38
39impl fmt::Display for Error {
40    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
41        let stage = match self.stage {
42            Stage::Lex => "lex",
43            Stage::Parse => "parse",
44        };
45        write!(
46            f,
47            "{stage} error at {}:{}: {}",
48            self.line, self.col, self.message
49        )
50    }
51}
52
53impl std::error::Error for Error {}