use clap::{Parser, Subcommand};
use pydep_mapper::crawler::build_directory_dependency_graph;
use pydep_mapper::tools::agent::print_agent_documentation;
use pydep_mapper::tools::changeset::{
ChangesetScope, analyze_changeset, formatters as changeset_formatters,
};
use pydep_mapper::tools::cycles::{detect_cycles, formatters as cycle_formatters};
use pydep_mapper::tools::dependencies::{analyze_dependencies, formatters as dep_formatters};
use pydep_mapper::tools::diagnose::{analyze_diagnose, formatters as diagnose_formatters};
use pydep_mapper::tools::external::{
analyze_external_dependencies, formatters as external_formatters,
};
use pydep_mapper::tools::impact::{analyze_impact, formatters};
use pydep_mapper::tools::instability::{analyze_instability, formatters as instability_formatters};
use pydep_mapper::tools::pressure::{analyze_pressure, formatters as pressure_formatters};
use std::path::Path;
#[derive(Parser)]
#[command(name = "pydep-mapper")]
#[command(about = "Python dependency mapper and analyzer")]
struct Args {
#[arg(long, default_value = ".")]
root: String,
#[command(subcommand)]
command: Commands,
}
#[derive(Subcommand)]
enum Commands {
Analyze,
Impact {
module_name: String,
},
Dependencies {
module_name: String,
},
Changeset {
module_name: String,
#[arg(long, default_value = "both")]
scope: String,
},
Cycles,
Diagnose,
Pressure,
Instability,
External,
Agent,
}
fn main() {
let args = Args::parse();
let dir_path = Path::new(&args.root);
pydep_mapper::pyproject::init(dir_path);
match args.command {
Commands::Analyze => match build_directory_dependency_graph(dir_path) {
Ok(graph) => {
println!("Analyzed directory: {}", args.root);
println!("{}", graph);
}
Err(e) => {
eprintln!("Error processing directory '{}': {}", args.root, e);
}
},
Commands::Impact { module_name } => match run_impact_analysis(dir_path, &module_name) {
Ok(()) => {}
Err(e) => {
eprintln!("Error running impact analysis: {}", e);
}
},
Commands::Dependencies { module_name } => {
match run_dependencies_analysis(dir_path, &module_name) {
Ok(()) => {}
Err(e) => {
eprintln!("Error running dependencies analysis: {}", e);
}
}
}
Commands::Changeset { module_name, scope } => {
match run_changeset_analysis(dir_path, &module_name, &scope) {
Ok(()) => {}
Err(e) => {
eprintln!("Error running changeset analysis: {}", e);
}
}
}
Commands::Cycles => match run_cycles_analysis(dir_path) {
Ok(()) => {}
Err(e) => {
eprintln!("Error running cycles analysis: {}", e);
}
},
Commands::Diagnose => match run_diagnose_analysis(dir_path) {
Ok(()) => {}
Err(e) => {
eprintln!("Error running diagnose analysis: {}", e);
}
},
Commands::Pressure => match run_pressure_analysis(dir_path) {
Ok(()) => {}
Err(e) => {
eprintln!("Error running pressure analysis: {}", e);
}
},
Commands::Instability => match run_instability_analysis(dir_path) {
Ok(()) => {}
Err(e) => {
eprintln!("Error running instability analysis: {}", e);
}
},
Commands::External => match run_external_analysis(dir_path) {
Ok(()) => {}
Err(e) => {
eprintln!("Error running external analysis: {}", e);
}
},
Commands::Agent => {
print_agent_documentation();
}
}
}
fn run_impact_analysis(dir_path: &Path, module_name: &str) -> anyhow::Result<()> {
let graph = build_directory_dependency_graph(dir_path)?;
let result = analyze_impact(&graph, module_name)?;
print!("{}", formatters::format_text_grouped(&result));
Ok(())
}
fn run_dependencies_analysis(dir_path: &Path, module_name: &str) -> anyhow::Result<()> {
let graph = build_directory_dependency_graph(dir_path)?;
let result = analyze_dependencies(&graph, module_name)?;
print!("{}", dep_formatters::format_text_grouped(&result));
Ok(())
}
fn run_cycles_analysis(dir_path: &Path) -> anyhow::Result<()> {
let graph = build_directory_dependency_graph(dir_path)?;
let result = detect_cycles(&graph)?;
print!("{}", cycle_formatters::format_text_grouped(&result));
Ok(())
}
fn run_pressure_analysis(dir_path: &Path) -> anyhow::Result<()> {
let graph = build_directory_dependency_graph(dir_path)?;
let result = analyze_pressure(&graph)?;
print!("{}", pressure_formatters::format_text(&result));
Ok(())
}
fn run_instability_analysis(dir_path: &Path) -> anyhow::Result<()> {
let graph = build_directory_dependency_graph(dir_path)?;
let result = analyze_instability(&graph)?;
print!("{}", instability_formatters::format_text(&result));
Ok(())
}
fn run_diagnose_analysis(dir_path: &Path) -> anyhow::Result<()> {
let graph = build_directory_dependency_graph(dir_path)?;
let result = analyze_diagnose(&graph)?;
print!("{}", diagnose_formatters::format_text(&result));
Ok(())
}
fn run_changeset_analysis(dir_path: &Path, module_name: &str, scope: &str) -> anyhow::Result<()> {
let graph = build_directory_dependency_graph(dir_path)?;
let changeset_scope = ChangesetScope::from_str(scope);
let result = analyze_changeset(&graph, module_name, changeset_scope)?;
print!("{}", changeset_formatters::format_text_grouped(&result));
Ok(())
}
fn run_external_analysis(dir_path: &Path) -> anyhow::Result<()> {
let graph = build_directory_dependency_graph(dir_path)?;
let result = analyze_external_dependencies(&graph)?;
print!("{}", external_formatters::format_text_grouped(&result));
Ok(())
}