agentshield/output/
json.rs1use std::path::Path;
2
3use serde::Serialize;
4
5use crate::error::Result;
6use crate::rules::policy::PolicyVerdict;
7use crate::rules::Finding;
8
9#[derive(Serialize)]
11struct FindingWithFingerprint<'a> {
12 #[serde(flatten)]
13 finding: &'a Finding,
14 fingerprint: String,
15}
16
17#[derive(Serialize)]
18struct JsonReport<'a> {
19 findings: Vec<FindingWithFingerprint<'a>>,
20 verdict: &'a PolicyVerdict,
21}
22
23pub fn render(findings: &[Finding], verdict: &PolicyVerdict, scan_root: &Path) -> Result<String> {
25 let findings_with_fp: Vec<FindingWithFingerprint<'_>> = findings
26 .iter()
27 .map(|f| FindingWithFingerprint {
28 finding: f,
29 fingerprint: f.fingerprint(scan_root),
30 })
31 .collect();
32
33 let report = JsonReport {
34 findings: findings_with_fp,
35 verdict,
36 };
37
38 let json = serde_json::to_string_pretty(&report)?;
39 Ok(json)
40}