neural_shared/report/
json.rs

1//! JSON reporter (LLM-friendly format)
2
3use super::{Finding, Reporter};
4use crate::Result;
5use serde::{Deserialize, Serialize};
6
7pub struct JsonReporter;
8
9impl<T: Finding> Reporter<T> for JsonReporter {
10    fn report(&self, findings: &[T]) -> Result<String> {
11        let items: Vec<GenericItem> = findings
12            .iter()
13            .map(|f| GenericItem {
14                kind: f.kind(),
15                name: f.name(),
16                file: f.file(),
17                line: f.line(),
18                column: f.column(),
19                reason: f.reason(),
20                confidence: f.confidence(),
21            })
22            .collect();
23
24        let report = GenericReport {
25            summary: Summary {
26                total_findings: findings.len(),
27            },
28            findings: items,
29        };
30
31        Ok(serde_json::to_string_pretty(&report)?)
32    }
33}
34
35/// Generic analysis report structure (LLM-friendly)
36#[derive(Debug, Serialize, Deserialize)]
37struct GenericReport {
38    summary: Summary,
39    findings: Vec<GenericItem>,
40}
41
42#[derive(Debug, Serialize, Deserialize)]
43struct Summary {
44    total_findings: usize,
45}
46
47#[derive(Debug, Serialize, Deserialize)]
48struct GenericItem {
49    kind: String,
50    name: String,
51    file: String,
52    line: usize,
53    column: usize,
54    reason: String,
55    confidence: String,
56}