syncable_cli/handlers/
generate.rs

1use crate::{analyzer::analyze_monorepo, generator};
2
3pub fn handle_generate(
4    path: std::path::PathBuf,
5    _output: Option<std::path::PathBuf>,
6    dockerfile: bool,
7    compose: bool,
8    terraform: bool,
9    all: bool,
10    dry_run: bool,
11    _force: bool,
12) -> crate::Result<()> {
13    println!("šŸ” Analyzing project for generation: {}", path.display());
14
15    let monorepo_analysis = analyze_monorepo(&path)?;
16
17    println!("āœ… Analysis complete. Generating IaC files...");
18
19    if monorepo_analysis.is_monorepo {
20        println!(
21            "šŸ“¦ Detected monorepo with {} projects",
22            monorepo_analysis.projects.len()
23        );
24        println!(
25            "🚧 Monorepo IaC generation is coming soon! For now, generating for the overall structure."
26        );
27        println!(
28            "šŸ’” Tip: You can run generate commands on individual project directories for now."
29        );
30    }
31
32    // For now, use the first/main project for generation
33    // TODO: Implement proper monorepo IaC generation
34    let main_project = &monorepo_analysis.projects[0];
35
36    let generate_all = all || (!dockerfile && !compose && !terraform);
37
38    if generate_all || dockerfile {
39        println!("\n🐳 Generating Dockerfile...");
40        let dockerfile_content = generator::generate_dockerfile(&main_project.analysis)?;
41
42        if dry_run {
43            println!("--- Dockerfile (dry run) ---");
44            println!("{}", dockerfile_content);
45        } else {
46            std::fs::write("Dockerfile", dockerfile_content)?;
47            println!("āœ… Dockerfile generated successfully!");
48        }
49    }
50
51    if generate_all || compose {
52        println!("\nšŸ™ Generating Docker Compose file...");
53        let compose_content = generator::generate_compose(&main_project.analysis)?;
54
55        if dry_run {
56            println!("--- docker-compose.yml (dry run) ---");
57            println!("{}", compose_content);
58        } else {
59            std::fs::write("docker-compose.yml", compose_content)?;
60            println!("āœ… Docker Compose file generated successfully!");
61        }
62    }
63
64    if generate_all || terraform {
65        println!("\nšŸ—ļø  Generating Terraform configuration...");
66        let terraform_content = generator::generate_terraform(&main_project.analysis)?;
67
68        if dry_run {
69            println!("--- main.tf (dry run) ---");
70            println!("{}", terraform_content);
71        } else {
72            std::fs::write("main.tf", terraform_content)?;
73            println!("āœ… Terraform configuration generated successfully!");
74        }
75    }
76
77    if !dry_run {
78        println!("\nšŸŽ‰ Generation complete! IaC files have been created in the current directory.");
79
80        if monorepo_analysis.is_monorepo {
81            println!("šŸ”§ Note: Generated files are based on the main project structure.");
82            println!("   Advanced monorepo support with per-project generation is coming soon!");
83        }
84    }
85
86    Ok(())
87}
88
89pub fn handle_validate(
90    _path: std::path::PathBuf,
91    _types: Option<Vec<String>>,
92    _fix: bool,
93) -> crate::Result<()> {
94    println!("šŸ” Validating IaC files...");
95    println!("āš ļø  Validation feature is not yet implemented.");
96    Ok(())
97}