use crate::ast::Position;
use std::fmt;
use thiserror::Error;
#[derive(Debug, Clone, Error)]
pub enum ParseError {
#[error("Expected '{expected}' but found '{found}' at line {}, column {}", .position.line, .position.column)]
UnexpectedToken {
expected: String,
found: String,
position: Position,
},
#[error("Unclosed block starting at line {}, column {}", .position.line, .position.column)]
UnclosedBlock { position: Position },
#[error("Failed to read file: {0}")]
IoError(String),
}
impl ParseError {
pub fn position(&self) -> Option<Position> {
match self {
ParseError::UnexpectedToken { position, .. } => Some(*position),
ParseError::UnclosedBlock { position } => Some(*position),
ParseError::IoError(_) => None,
}
}
}
pub type ParseResult<T> = Result<T, ParseError>;
impl fmt::Display for Position {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "{}:{}", self.line, self.column)
}
}