Skip to main content

agentshield/output/
json.rs

1use std::path::Path;
2
3use serde::Serialize;
4
5use crate::error::Result;
6use crate::rules::policy::PolicyVerdict;
7use crate::rules::Finding;
8
9/// A finding entry with an attached fingerprint for JSON output.
10#[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
23/// Render findings as a JSON report, with a `fingerprint` field on each finding.
24pub 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}