use nom::Offset;
use scanner::ScanError;
pub mod scanner;
#[derive(Debug, PartialEq, Eq, Clone)]
#[non_exhaustive]
pub struct Error {
pub offset: usize,
pub reason: String,
}
impl std::fmt::Display for Error {
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
write!(f, "error at offset {}: {}", self.offset, self.reason)
}
}
impl std::error::Error for Error {}
impl Error {
pub(crate) fn from_nom_error(
err: nom::Err<ScanError<&str>>,
start: &str,
context: &str,
) -> Self {
match err {
nom::Err::Incomplete(_) => Error {
offset: start.len(),
reason: format!("{context}: incomplete"),
},
nom::Err::Failure(err) | nom::Err::Error(err) => {
let offset = start.offset(err.input);
Error {
offset,
reason: format!("{}: {}", context, err.reason),
}
}
}
}
}