ferrous_forge/commands/validate/
mod.rs

1//! Validate command implementation
2
3pub mod ai_report;
4pub mod checks;
5pub mod markdown;
6pub mod utils;
7
8use ai_report::generate_ai_report;
9use checks::{run_additional_checks, run_clippy_validation};
10
11use crate::{
12    Result,
13    validation::{RustValidator, Violation},
14};
15use console::style;
16use std::path::{Path, PathBuf};
17
18/// Execute the validate command
19pub async fn execute(path: Option<PathBuf>, ai_report: bool) -> Result<()> {
20    let project_path = path.unwrap_or_else(|| std::env::current_dir().unwrap_or_default());
21
22    print_header(&project_path);
23
24    let validator = RustValidator::new(project_path.clone())?;
25    let violations = validator.validate_project().await?;
26
27    display_validation_results(&validator, &violations)?;
28
29    if ai_report {
30        generate_ai_report_with_message(&project_path, &violations).await?;
31    }
32
33    let clippy_result = run_clippy_validation(&validator).await?;
34    run_additional_checks(&project_path).await;
35
36    handle_final_result(&violations, &clippy_result);
37
38    Ok(())
39}
40
41fn print_header(project_path: &Path) {
42    println!();
43    println!("{}", style("🦀 Running Ferrous Forge validation...").bold());
44    println!();
45
46    println!("📁 Project: {}", project_path.display());
47    println!();
48}
49
50fn display_validation_results(validator: &RustValidator, violations: &[Violation]) -> Result<()> {
51    let report = validator.generate_report(violations);
52
53    println!("{}", report);
54
55    Ok(())
56}
57
58async fn generate_ai_report_with_message(
59    project_path: &PathBuf,
60    violations: &[Violation],
61) -> Result<()> {
62    generate_ai_report(project_path, violations).await
63}
64
65fn handle_final_result(violations: &[Violation], clippy_result: &crate::validation::ClippyResult) {
66    if !violations.is_empty() || !clippy_result.success {
67        println!(
68            "{}",
69            style("❌ Validation completed with issues").red().bold()
70        );
71        std::process::exit(1);
72    } else {
73        println!(
74            "{}",
75            style("✅ All validation checks passed!").green().bold()
76        );
77    }
78}