use miette::SourceSpan;
use crate::{Error, Severity};
pub trait DiagnosticReporter {
fn finish(&mut self, result: &DiagnosticResult) -> Option<String>;
fn render_error(&mut self, error: Error) -> Option<String>;
}
#[derive(Default, Debug)]
pub struct DiagnosticResult {
warnings_count: usize,
errors_count: usize,
max_warnings_exceeded: bool,
}
impl DiagnosticResult {
pub fn new(warnings_count: usize, errors_count: usize, max_warnings_exceeded: bool) -> Self {
Self { warnings_count, errors_count, max_warnings_exceeded }
}
pub fn warnings_count(&self) -> usize {
self.warnings_count
}
pub fn errors_count(&self) -> usize {
self.errors_count
}
pub fn max_warnings_exceeded(&self) -> bool {
self.max_warnings_exceeded
}
}
#[derive(Debug)]
pub struct Info {
pub start: InfoPosition,
pub end: InfoPosition,
pub filename: String,
pub message: String,
pub severity: Severity,
pub rule_id: Option<String>,
}
#[derive(PartialEq, Eq, PartialOrd, Ord, Debug)]
pub struct InfoPosition {
pub line: usize,
pub column: usize,
}
impl Info {
pub fn new(diagnostic: &Error) -> Self {
let mut start = InfoPosition { line: 0, column: 0 };
let mut end = InfoPosition { line: 0, column: 0 };
let mut filename = String::new();
let mut message = String::new();
let mut severity = Severity::Warning;
let rule_id = diagnostic.code().map(|code| code.to_string());
if let Some(mut labels) = diagnostic.labels()
&& let Some(source) = diagnostic.source_code()
&& let Some(label) = labels.next()
&& let Ok(span_content) = source.read_span(label.inner(), 0, 0)
{
start.line = span_content.line() + 1;
start.column = span_content.column() + 1;
let end_offset = label.inner().offset() + label.inner().len();
if let Ok(span_content) = source.read_span(&SourceSpan::from((end_offset, 0)), 0, 0) {
end.line = span_content.line() + 1;
end.column = span_content.column() + 1;
}
if let Some(name) = span_content.name() {
filename = name.to_string();
}
if matches!(diagnostic.severity(), Some(Severity::Error)) {
severity = Severity::Error;
}
message = diagnostic.to_string();
}
Self { start, end, filename, message, severity, rule_id }
}
}