feat: add BuildCodeGraph use case, sink orchestration out of presentation
This commit is contained in:
@@ -2,8 +2,8 @@ mod cli;
|
||||
|
||||
use anyhow::{Result, bail};
|
||||
|
||||
use archlens_application::queries::AnalyzeCodebase;
|
||||
use archlens_application::use_cases::{
|
||||
build_code_graph::BuildCodeGraph,
|
||||
check_freshness::CheckFreshness,
|
||||
diff_diagram::DiffDiagram,
|
||||
generate_diagram::GenerateDiagram,
|
||||
@@ -152,23 +152,28 @@ fn build_graph(args: &Cli, level: DiagramLevel) -> Result<NormalizedGraph> {
|
||||
analysis_config = analysis_config.with_changed_files(changed);
|
||||
}
|
||||
|
||||
if level == DiagramLevel::Project {
|
||||
let project_analyzer: Option<Box<dyn ProjectAnalyzer>> = {
|
||||
let cargo_toml = args.path.join("Cargo.toml");
|
||||
let project_graph = if cargo_toml.exists() {
|
||||
CargoWorkspaceAnalyzer::new().analyze(&args.path)?
|
||||
let pyproject = args.path.join("pyproject.toml");
|
||||
if cargo_toml.exists() {
|
||||
Some(Box::new(CargoWorkspaceAnalyzer::new()))
|
||||
} else if pyproject.exists() {
|
||||
Some(Box::new(PythonProjectAnalyzer::new()))
|
||||
} else {
|
||||
PythonProjectAnalyzer::new().analyze(&args.path)?
|
||||
};
|
||||
return Ok(NormalizedGraph::from_project(project_graph));
|
||||
}
|
||||
None
|
||||
}
|
||||
};
|
||||
|
||||
let discovery = WalkdirDiscovery::new();
|
||||
let analyzer = TreeSitterAnalyzer::new();
|
||||
let analyze = AnalyzeCodebase::new(discovery, analyzer);
|
||||
let result = analyze.execute(&args.path, &analysis_config)?;
|
||||
let use_case = BuildCodeGraph {
|
||||
discovery: WalkdirDiscovery::new(),
|
||||
source_analyzer: TreeSitterAnalyzer::new(),
|
||||
project_analyzer,
|
||||
};
|
||||
|
||||
if !result.warnings().is_empty() {
|
||||
for warning in result.warnings() {
|
||||
let result = use_case.execute(&args.path, &analysis_config, level)?;
|
||||
|
||||
if !result.warnings.is_empty() {
|
||||
for warning in &result.warnings {
|
||||
eprintln!(
|
||||
"WARNING: {}:{} {}",
|
||||
warning.file_path().as_str(),
|
||||
@@ -179,26 +184,12 @@ fn build_graph(args: &Cli, level: DiagramLevel) -> Result<NormalizedGraph> {
|
||||
if args.strict {
|
||||
bail!(
|
||||
"analysis produced {} warning(s) in strict mode",
|
||||
result.warnings().len()
|
||||
result.warnings.len()
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
let mut graph = result.graph().clone();
|
||||
|
||||
if level == DiagramLevel::Module {
|
||||
let workspace_toml = args.path.join("Cargo.toml");
|
||||
let project_graph = if workspace_toml.exists() {
|
||||
CargoWorkspaceAnalyzer::new().analyze(&args.path).ok()
|
||||
} else {
|
||||
PythonProjectAnalyzer::new().analyze(&args.path).ok()
|
||||
};
|
||||
if let Some(pg) = project_graph {
|
||||
graph.merge_project_edges(&pg);
|
||||
}
|
||||
}
|
||||
|
||||
Ok(graph)
|
||||
Ok(result.graph)
|
||||
}
|
||||
|
||||
fn create_renderer(
|
||||
|
||||
Reference in New Issue
Block a user