use std::error::Error;
use std::fmt;
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub struct SourceLocation {
pub line: u32,
pub column: u32,
pub byte_offset: usize,
}
impl fmt::Display for SourceLocation {
fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(formatter, "{}:{}", self.line, self.column)
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum Severity {
Error,
Warning,
Info,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct Finding {
pub rule_id: String,
pub severity: Severity,
pub message: String,
pub location: Option<SourceLocation>,
}
#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)]
pub struct CheckReport {
pub findings: Vec<Finding>,
}
impl CheckReport {
#[must_use]
pub fn has_errors(&self) -> bool {
self.findings
.iter()
.any(|finding| finding.severity == Severity::Error)
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
#[non_exhaustive]
pub enum CheckError {
Initialization {
message: String,
},
}
impl fmt::Display for CheckError {
fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
Self::Initialization { message } => {
write!(formatter, "checker initialization failed: {message}")
}
}
}
}
impl Error for CheckError {}