1pub mod cli;
2pub mod analyzer;
3pub mod models;
4
5use std::fs;
6use walkdir::WalkDir;
7
8use crate::cli::{Cli, select_directory, select_files};
9use crate::analyzer::{is_typescript_file, analyze_file, generate_summary};
10use crate::models::Output;
11
12pub fn run_app(cli: Cli) -> Result<(), Box<dyn std::error::Error>> {
13 let target_dir = select_directory(cli.interactive, &cli.path);
14 println!("Analyzing directory: {}", target_dir.display());
15
16 let mut ts_files = Vec::new();
17
18 for entry in WalkDir::new(&target_dir).into_iter().filter_map(|e| e.ok()) {
19 let path = entry.path();
20 if path.is_file() && is_typescript_file(path) {
21 ts_files.push(path.to_path_buf());
22 }
23 }
24
25 println!("Found {} TypeScript/JavaScript files", ts_files.len());
26
27 let selected_files = select_files(cli.interactive, &target_dir, ts_files);
28
29 let mut file_analyses = Vec::new();
30
31 for file_path in &selected_files {
32 print!("Analyzing {}... ", file_path.display());
33
34 if let Some(analysis) = analyze_file(file_path) {
35 println!("Done");
36 file_analyses.push(analysis);
37 } else {
38 println!("Failed");
39 }
40 }
41
42 let summary = generate_summary(&file_analyses);
43
44 let output = Output {
45 files: file_analyses,
46 summary,
47 };
48
49 let json = serde_json::to_string_pretty(&output)?;
50
51 match cli.output {
52 Some(file) => {
53 fs::write(&file, &json)?;
54 println!("Analysis written to {}", file);
55 },
56 None => {
57 println!("{}", json);
58 }
59 }
60
61 Ok(())
62}