use crate::span::Span;
use std::fmt;
#[derive(Debug, Clone)]
pub struct SpannedError {
pub message: String,
pub span: Span,
}
impl SpannedError {
pub fn new(message: impl Into<String>, span: Span) -> Self {
Self {
message: message.into(),
span,
}
}
}
impl fmt::Display for SpannedError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "{} at {}..{}", self.message, self.span.start, self.span.end)
}
}
impl std::error::Error for SpannedError {}
pub type Result<T> = std::result::Result<T, SpannedError>;
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn spanned_error_display() {
let err = SpannedError::new("test error", Span::new(5, 10));
let display = format!("{}", err);
assert!(display.contains("test error"));
assert!(display.contains("5..10"));
}
}