slopguard_core/
finding.rs1use std::path::PathBuf;
2
3use serde::{Deserialize, Serialize};
4
5use crate::rule::{Category, RuleId, Severity};
6
7#[derive(Debug, Clone, Serialize, Deserialize)]
9pub struct Finding {
10 pub rule_id: RuleId,
11 pub severity: Severity,
12 pub category: Category,
13 pub message: String,
14 #[serde(skip_serializing_if = "Option::is_none")]
15 pub note: Option<String>,
16 #[serde(skip_serializing_if = "Option::is_none")]
17 pub fix: Option<String>,
18 pub file: PathBuf,
19 pub line: usize,
20 pub column: usize,
21 pub end_line: usize,
22 pub end_column: usize,
23 pub matched_text: String,
24 #[serde(default, skip_serializing_if = "Option::is_none")]
28 pub confidence: Option<f64>,
29 #[serde(default)]
33 pub escalated: bool,
34}
35
36#[derive(Debug, Clone, Serialize, Deserialize)]
38pub struct ScanStats {
39 pub errors: usize,
40 pub warnings: usize,
41 pub total: usize,
42 pub files_scanned: usize,
43 #[serde(default)]
45 pub baseline_filtered: usize,
46 #[serde(default, skip_serializing_if = "Option::is_none")]
49 pub diff_base: Option<String>,
50 #[serde(default, skip_serializing_if = "Option::is_none")]
52 pub files_changed: Option<usize>,
53}
54
55#[derive(Debug, Clone, Default, Serialize, Deserialize)]
57pub struct CacheStats {
58 pub cached: usize,
59 pub changed: usize,
60}
61
62#[derive(Debug, Clone, Serialize, Deserialize)]
64pub struct ScanResult {
65 pub findings: Vec<Finding>,
66 pub stats: ScanStats,
67 #[serde(default)]
68 pub cache_stats: Option<CacheStats>,
69}