syncable_cli/handlers/
generate.rs

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