use super::parser::{BadEscapeError, NumberError};
#[derive(Debug, thiserror::Error)]
#[error("{error} at {}-{}", .location.0, .location.1.saturating_sub(1))]
pub struct SpannedError<T> {
pub error: T,
pub location: (usize, usize),
}
impl<T> SpannedError<T> {
pub fn map<U>(self, transform: impl FnOnce(T) -> U) -> SpannedError<U> {
SpannedError {
error: transform(self.error),
location: self.location,
}
}
}
#[derive(Debug, thiserror::Error)]
pub enum LexicalError {
#[error("`{0}` can't be used here")]
Unexpected(char),
#[error("unterminated string; did you forget a closing `\"`?")]
UnterminatedString,
#[error(transparent)]
BadEscape(#[from] BadEscapeError),
#[error(transparent)]
NotNumber(#[from] NumberError),
#[error("this expression is invalid")]
BadToken,
}