use crate::span::{SourceMap, Span};
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum Severity {
Error,
Warning,
}
#[derive(Clone, Debug)]
pub struct Diagnostic {
pub severity: Severity,
pub message: String,
pub span: Option<Span>,
}
impl Diagnostic {
pub fn error(message: impl Into<String>, span: Span) -> Self {
Diagnostic {
severity: Severity::Error,
message: message.into(),
span: Some(span),
}
}
pub fn warning(message: impl Into<String>, span: Span) -> Self {
Diagnostic {
severity: Severity::Warning,
message: message.into(),
span: Some(span),
}
}
pub fn global_error(message: impl Into<String>) -> Self {
Diagnostic {
severity: Severity::Error,
message: message.into(),
span: None,
}
}
pub fn global_warning(message: impl Into<String>) -> Self {
Diagnostic {
severity: Severity::Warning,
message: message.into(),
span: None,
}
}
pub fn render(&self, sources: &SourceMap) -> String {
let sev = match self.severity {
Severity::Error => "error",
Severity::Warning => "warning",
};
match self.span {
Some(span) => {
let loc = sources.locate(span);
format!(
"{}:{}:{}: {sev}: {}",
loc.file.display(),
loc.line,
loc.column,
self.message
)
}
None => format!("{sev}: {}", self.message),
}
}
}