1pub mod budget;
8pub mod graph;
9pub mod output;
10pub mod parser;
11pub mod walker;
12
13use std::path::{Path, PathBuf};
14
15use argus_core::{ArgusError, OutputFormat};
16
17pub fn generate_map(
37 root: &Path,
38 max_tokens: usize,
39 focus_files: &[PathBuf],
40 format: OutputFormat,
41) -> Result<String, ArgusError> {
42 let files = walker::walk_repo(root)?;
43
44 let mut all_symbols = Vec::new();
45 let mut all_references = Vec::new();
46
47 for file in &files {
48 let symbols = parser::extract_symbols(file)?;
49 let references = parser::extract_references(file)?;
50 all_symbols.extend(symbols);
51 all_references.extend(references);
52 }
53
54 let mut symbol_graph = graph::SymbolGraph::build(all_symbols, all_references);
55 symbol_graph.compute_pagerank();
56
57 let ranked = if focus_files.is_empty() {
58 symbol_graph.ranked_symbols()
59 } else {
60 symbol_graph.ranked_symbols_for_files(focus_files)
61 };
62
63 let selected = budget::fit_to_budget(&ranked, max_tokens);
64
65 match format {
66 OutputFormat::Text => Ok(output::format_tree(&selected)),
67 OutputFormat::Json => output::format_json(&selected),
68 OutputFormat::Markdown => Ok(output::format_markdown(&selected)),
69 OutputFormat::Sarif => Err(ArgusError::Config(
70 "SARIF output is only supported for the review subcommand.".into(),
71 )),
72 }
73}