use std::fmt::{Display, Formatter};
use std::path::PathBuf;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct Span {
pub start: usize,
pub end: usize,
}
impl Span {
pub const fn new(start: usize, end: usize) -> Self {
Self { start, end }
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum Severity {
Error,
Warning,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct Diagnostic {
pub severity: Severity,
pub message: String,
pub path: PathBuf,
pub span: Span,
}
impl Diagnostic {
pub fn error(path: impl Into<PathBuf>, span: Span, message: impl Into<String>) -> Self {
Self {
severity: Severity::Error,
message: message.into(),
path: path.into(),
span,
}
}
pub fn warning(path: impl Into<PathBuf>, span: Span, message: impl Into<String>) -> Self {
Self {
severity: Severity::Warning,
message: message.into(),
path: path.into(),
span,
}
}
}
impl Display for Diagnostic {
fn fmt(&self, formatter: &mut Formatter<'_>) -> std::fmt::Result {
write!(
formatter,
"{}:{}..{}: {}",
self.path.display(),
self.span.start,
self.span.end,
self.message
)
}
}
impl std::error::Error for Diagnostic {}