use super::capabilities::CapabilitySet;
use super::model::LanguageModel;
use super::types::{Finding, Severity};
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct RuleMeta {
pub id: String,
pub name: String,
pub description: String,
pub default_severity: Severity,
pub required_capabilities: CapabilitySet,
pub autofix_safe: bool,
}
pub trait Rule: Send + Sync {
fn meta(&self) -> &RuleMeta;
fn evaluate(&self, model: &LanguageModel) -> Vec<Finding>;
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct RuleSelection {
pub enabled: Vec<String>,
pub disabled: Vec<String>,
pub min_severity: Option<Severity>,
}
impl RuleSelection {
pub fn allows(&self, rule_id: &str) -> bool {
if self.disabled.iter().any(|d| d == rule_id || d == "*") {
return false;
}
if self.enabled.is_empty() {
return true;
}
self.enabled.iter().any(|e| e == rule_id || e == "*")
}
}