1use anyhow::Result;
2
3use crate::{
4 config::ResolvedConfig,
5 discovery, frontend, linker,
6 model::{ArtifactDoc, EdgeDoc, ProjectInfo, ScanSummary, WarningDoc},
7 output, r#rust,
8 security::apply_artifact_security,
9 tauri_config,
10};
11
12pub struct ScanBundle {
13 pub artifacts: Vec<ArtifactDoc>,
14 pub edges: Vec<EdgeDoc>,
15 pub warnings: Vec<WarningDoc>,
16 pub summary: ScanSummary,
17 pub project_info: ProjectInfo,
18}
19
20pub fn scan_project(config: &ResolvedConfig) -> Result<ScanBundle> {
21 let discovery = discovery::discover(config)?;
22
23 let mut artifacts = Vec::new();
24 let mut warnings = Vec::new();
25
26 let (frontend_artifacts, frontend_warnings) = frontend::extract(config, &discovery)?;
27 artifacts.extend(frontend_artifacts);
28 warnings.extend(frontend_warnings);
29 artifacts.extend(r#rust::extract(config, &discovery)?);
30 artifacts.extend(tauri_config::extract(config, &discovery)?);
31
32 for artifact in &mut artifacts {
33 artifact.has_related_tests = !artifact.related_tests.is_empty();
34 apply_artifact_security(artifact);
35 }
36
37 let edges = linker::link(&mut artifacts, &mut warnings)?;
38 let summary = output::build_summary(&config.repo, &artifacts, &edges, &warnings);
39 let project_info = ProjectInfo {
40 repo: config.repo.clone(),
41 repo_path: config.root.to_string_lossy().to_string(),
42 output_dir: config.output_dir.to_string_lossy().to_string(),
43 index_uid: config.file.meilisearch.index.clone(),
44 artifact_count: summary.artifact_count,
45 edge_count: summary.edge_count,
46 warning_count: summary.warning_count,
47 scanned_at: summary.scanned_at.clone(),
48 };
49
50 Ok(ScanBundle {
51 artifacts,
52 edges,
53 warnings,
54 summary,
55 project_info,
56 })
57}