pub type Result<T> = std::result::Result<T, Error>;
#[derive(Debug, Clone)]
pub enum Error {
Parse {
message: String,
line: usize,
column: usize,
},
}
impl std::fmt::Display for Error {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
let Self::Parse {
message,
line,
column,
} = self;
if *line > 0 {
write!(f, "parse error at line {line}, column {column}: {message}")
} else {
write!(f, "parse error: {message}")
}
}
}
impl std::error::Error for Error {}
impl Error {
pub fn parse_at(message: impl Into<String>, line: usize, column: usize) -> Self {
Self::Parse {
message: message.into(),
line,
column,
}
}
pub fn parse(message: impl Into<String>) -> Self {
Self::Parse {
message: message.into(),
line: 0,
column: 0,
}
}
}