use serde::{Deserialize, Serialize};
#[derive(
Clone,
Copy,
Debug,
PartialEq,
Eq,
Serialize,
Deserialize,
rkyv::Archive,
rkyv::Serialize,
rkyv::Deserialize,
)]
#[rkyv(derive(Debug))]
pub enum DiagnosticLevel {
Hint,
Warning,
Error,
}
#[derive(
Clone, Debug, Serialize, Deserialize, rkyv::Archive, rkyv::Serialize, rkyv::Deserialize,
)]
#[rkyv(derive(Debug))]
pub struct Location {
pub file: String,
pub line: u32,
pub column: Option<u32>,
}
impl Location {
pub fn new(file: &str, line: u32) -> Self {
Self {
file: file.into(),
line,
column: None,
}
}
pub fn with_column(file: &str, line: u32, column: u32) -> Self {
Self {
file: file.into(),
line,
column: Some(column),
}
}
}
#[derive(
Clone, Debug, Serialize, Deserialize, rkyv::Archive, rkyv::Serialize, rkyv::Deserialize,
)]
#[rkyv(derive(Debug))]
pub struct Diagnostic {
pub rule_id: String,
pub level: DiagnosticLevel,
pub message: String,
pub location: Option<Location>,
pub related: Vec<Location>,
pub suggestion: Option<String>,
}
impl Diagnostic {
pub fn new(rule_id: &str, level: DiagnosticLevel, message: &str) -> Self {
Self {
rule_id: rule_id.into(),
level,
message: message.into(),
location: None,
related: Vec::new(),
suggestion: None,
}
}
pub fn error(rule_id: &str, message: &str) -> Self {
Self::new(rule_id, DiagnosticLevel::Error, message)
}
pub fn warning(rule_id: &str, message: &str) -> Self {
Self::new(rule_id, DiagnosticLevel::Warning, message)
}
pub fn hint(rule_id: &str, message: &str) -> Self {
Self::new(rule_id, DiagnosticLevel::Hint, message)
}
pub fn at(mut self, file: &str, line: u32) -> Self {
self.location = Some(Location::new(file, line));
self
}
pub fn with_related(mut self, file: &str, line: u32) -> Self {
self.related.push(Location::new(file, line));
self
}
pub fn with_suggestion(mut self, suggestion: &str) -> Self {
self.suggestion = Some(suggestion.into());
self
}
}