use thiserror::Error;
pub type Result<T> = std::result::Result<T, LexerError>;
#[derive(Debug, Clone, Error)]
pub enum LexerError {
#[error("Unterminated string literal starting at position {position}")]
UnterminatedString { position: usize },
#[error("Unterminated regex starting at position {position}")]
UnterminatedRegex { position: usize },
#[error("Invalid escape sequence '\\{char}' at position {position}")]
InvalidEscape { char: char, position: usize },
#[error("Invalid numeric literal at position {position}: {reason}")]
InvalidNumber { position: usize, reason: String },
#[error("Unexpected character '{char}' at position {position}")]
UnexpectedChar { char: char, position: usize },
#[error("Invalid UTF-8 at position {position}")]
InvalidUtf8 { position: usize },
#[error("Heredoc error at position {position}: {reason}")]
HeredocError { position: usize, reason: String },
#[error("{0}")]
Other(String),
}
impl LexerError {
pub fn position(&self) -> Option<usize> {
match self {
LexerError::UnterminatedString { position }
| LexerError::UnterminatedRegex { position }
| LexerError::InvalidEscape { position, .. }
| LexerError::InvalidNumber { position, .. }
| LexerError::UnexpectedChar { position, .. }
| LexerError::InvalidUtf8 { position }
| LexerError::HeredocError { position, .. } => Some(*position),
LexerError::Other(_) => None,
}
}
}