use std::fmt;
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum ParserError {
UnexpectedToken {
line: u64,
column: u64,
expected: String,
found: String,
},
ExpectedToken {
line: u64,
column: u64,
expected: String,
found: String,
},
UnterminatedString { line: u64, column: u64 },
InvalidNumber {
line: u64,
column: u64,
value: String,
},
InvalidVector { line: u64, column: u64 },
RecursionLimitExceeded { depth: usize },
}
impl fmt::Display for ParserError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
Self::UnexpectedToken {
line,
column,
expected,
found,
} => write!(
f,
"error[ALOPEX-P001]: unexpected token at line {line}, column {column}: expected {expected}, found {found}"
),
Self::ExpectedToken {
line,
column,
expected,
found,
} => write!(
f,
"error[ALOPEX-P002]: expected {expected} but found {found} at line {line}, column {column}"
),
Self::UnterminatedString { line, column } => write!(
f,
"error[ALOPEX-P003]: unterminated string literal starting at line {line}, column {column}"
),
Self::InvalidNumber {
line,
column,
value,
} => write!(
f,
"error[ALOPEX-P004]: invalid number literal '{value}' at line {line}, column {column}"
),
Self::InvalidVector { line, column } => write!(
f,
"error[ALOPEX-P005]: invalid vector literal at line {line}, column {column}"
),
Self::RecursionLimitExceeded { depth } => write!(
f,
"error[ALOPEX-P006]: recursion limit exceeded (depth: {depth})"
),
}
}
}
impl std::error::Error for ParserError {}
pub type Result<T> = std::result::Result<T, ParserError>;