use serde::Serialize;
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Serialize)]
#[serde(rename_all = "kebab-case")]
pub enum Container {
#[default]
Prose,
FencedCode,
Blockquote,
Quoted,
Heading,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize)]
pub struct Finding {
pub rule_id: String,
pub span: (usize, usize),
pub snippet: String,
pub snippet_truncated: bool,
pub container: Container,
pub topic_term: bool,
}
#[derive(Debug, Clone, Copy, Default, PartialEq, Serialize)]
pub struct ClassDensity {
pub hits: usize,
pub residual_hits: usize,
pub per_1k_words: Option<f64>,
pub residual_per_1k_words: Option<f64>,
}
#[derive(Debug, Clone, Copy, Default, PartialEq, Serialize)]
pub struct Densities {
pub spike: ClassDensity,
pub background: ClassDensity,
pub individual: ClassDensity,
}
#[derive(Debug, Clone, Copy, Default, PartialEq, Serialize)]
pub struct Stats {
pub word_count: usize,
pub byte_len: usize,
pub densities: Densities,
}
#[derive(Debug, Clone, Default, PartialEq, Serialize)]
pub struct EvidenceReport {
pub paste_residue: Vec<Finding>,
pub quality_patterns: Vec<Finding>,
pub injection_patterns: Vec<Finding>,
pub stats: Stats,
}
#[derive(Debug, Clone, PartialEq, Serialize)]
pub struct BundleFile {
pub path: String,
pub report: EvidenceReport,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize)]
pub struct CrossFileOccurrence {
pub path: String,
pub span: (usize, usize),
pub container: Container,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize)]
pub struct CrossFileDuplication {
pub snippet: String,
pub snippet_truncated: bool,
pub occurrences: Vec<CrossFileOccurrence>,
}
#[derive(Debug, Clone, Default, PartialEq, Serialize)]
pub struct BundleReport {
pub files: Vec<BundleFile>,
pub cross_file_duplication: Vec<CrossFileDuplication>,
}