rusty_react_flow/
lib.rs

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}