use crate::config::ProjectConfig;
use crate::graph::GraphQuery;
use crate::models::Finding;
use anyhow::Result;
use std::collections::HashSet;
use std::path::{Path, PathBuf};
pub struct PostprocessInput<'a> {
pub findings: Vec<Finding>,
pub project_config: &'a ProjectConfig,
pub graph: &'a dyn GraphQuery,
pub all_files: &'a [PathBuf],
pub repo_path: &'a Path,
pub verify: bool,
pub bypass_set: HashSet<String>,
}
pub struct PostprocessStats {
pub input_count: usize,
pub output_count: usize,
pub suppressed: usize,
pub excluded: usize,
pub deduped: usize,
pub fp_filtered: usize,
pub security_downgraded: usize,
}
pub struct PostprocessOutput {
pub findings: Vec<Finding>,
pub stats: PostprocessStats,
}
pub fn postprocess_stage(input: PostprocessInput) -> Result<PostprocessOutput> {
let input_count = input.findings.len();
let mut findings = input.findings;
let cache_dir = std::env::temp_dir().join("repotoire-stage-noop-cache");
let mut dummy_cache = crate::detectors::IncrementalCache::new(&cache_dir);
crate::cli::analyze::postprocess::postprocess_findings(
&mut findings,
input.project_config,
&mut dummy_cache,
false, &[], input.all_files,
0, input.verify,
input.graph,
false, None, false, input.repo_path,
&input.bypass_set,
);
let output_count = findings.len();
let total_removed = input_count.saturating_sub(output_count);
Ok(PostprocessOutput {
findings,
stats: PostprocessStats {
input_count,
output_count,
suppressed: 0, excluded: 0,
deduped: 0,
fp_filtered: total_removed,
security_downgraded: 0,
},
})
}