use serde::{Deserialize, Serialize};
use crate::{Category, Severity};
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum Decision {
Allow,
Warn,
Block,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct Finding {
pub rule_id: String,
pub category: Category,
pub severity: Severity,
pub start: usize,
pub end: usize,
pub normalized_only: bool,
}
impl Finding {
pub fn excerpt<'a>(&self, original: &'a str) -> &'a str {
&original[self.start..self.end]
}
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct Report {
pub decision: Decision,
pub findings: Vec<Finding>,
pub normalized: bool,
pub removed_invisible: usize,
}
impl Report {
pub fn is_blocked(&self) -> bool {
self.decision == Decision::Block
}
pub fn highest_severity(&self) -> Option<Severity> {
self.findings.iter().map(|f| f.severity).max()
}
pub fn by_category(&self, category: Category) -> impl Iterator<Item = &Finding> {
self.findings.iter().filter(move |f| f.category == category)
}
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct Redacted {
pub text: String,
pub report: Report,
}