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 {}