use serde::Serialize;
use std::fmt;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize)]
#[serde(rename_all = "snake_case")]
pub enum RuleId {
UndefinedVariable,
UndefinedGlobal,
UndefinedField,
UnusedVariable,
}
impl fmt::Display for RuleId {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
Self::UndefinedVariable => write!(f, "undefined-variable"),
Self::UndefinedGlobal => write!(f, "undefined-global"),
Self::UndefinedField => write!(f, "undefined-field"),
Self::UnusedVariable => write!(f, "unused-variable"),
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize)]
#[serde(rename_all = "lowercase")]
pub enum Severity {
Error,
Warning,
Info,
}
#[derive(Debug, Clone, Serialize)]
pub struct Diagnostic {
pub rule: RuleId,
pub severity: Severity,
pub message: String,
pub line: usize,
pub column: usize,
}
#[derive(Debug, Clone, Serialize)]
pub struct LintResult {
pub diagnostics: Vec<Diagnostic>,
pub error_count: usize,
pub warning_count: usize,
}
impl LintResult {
pub fn new(diagnostics: Vec<Diagnostic>) -> Self {
let error_count = diagnostics
.iter()
.filter(|d| d.severity == Severity::Error)
.count();
let warning_count = diagnostics
.iter()
.filter(|d| d.severity == Severity::Warning)
.count();
Self {
diagnostics,
error_count,
warning_count,
}
}
pub fn has_errors(&self) -> bool {
self.error_count > 0
}
}