use std::fmt;
use proc_macro2::Span;
use crate::parse::Position;
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct Error {
pub file: String,
pub line: usize,
pub column: usize,
pub message: String,
}
impl Error {
pub(crate) fn at(file: &str, position: Position, message: impl Into<String>) -> Self {
Error {
file: file.to_string(),
line: position.line,
column: position.column,
message: message.into(),
}
}
}
impl fmt::Display for Error {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(
f,
"{}:{}:{}: {}",
self.file, self.line, self.column, self.message
)
}
}
impl std::error::Error for Error {}
pub(crate) struct Diag {
pub(crate) line: usize,
pub(crate) column: usize,
pub(crate) message: String,
}
pub(crate) type Res<T> = Result<T, Diag>;
pub(crate) fn diag(span: Span, message: impl Into<String>) -> Diag {
let start = span.start();
Diag {
line: start.line,
column: start.column + 1,
message: message.into(),
}
}