Skip to main content

kegani_cli/commands/
docker.rs

1//! `keg docker` command — Generate Dockerfile and docker-compose.yml
2
3use anyhow::{Context, Result};
4use console::{style, Emoji};
5use std::fs;
6use std::path::Path;
7
8/// Generate Dockerfile and docker-compose.yml
9pub fn docker() -> Result<()> {
10    println!();
11    println!("{} {}", Emoji("🐳", ""), style("Generating Docker files").bold());
12    println!();
13
14    let project_name = std::env::current_dir()
15        .ok()
16        .and_then(|p| p.file_name().map(|n| n.to_string_lossy().to_string()))
17        .unwrap_or_else(|| "app".to_string());
18
19    let replacements: &[(&str, &str)] = &[("{{PROJECT_NAME}}", project_name.as_str())];
20
21    // Dockerfile
22    let df_path = Path::new("Dockerfile");
23    if df_path.exists() {
24        println!("  {} {} already exists, skipping", style("⚠").yellow(), style("Dockerfile").dim());
25    } else {
26        fs::write(df_path, render_template(include_str!("../templates/dockerfile_txt.txt"), replacements))
27            .context("Failed to write Dockerfile")?;
28        println!("  {} {}", style("✓").green(), style("Dockerfile").dim());
29    }
30
31    // docker-compose.yml
32    let dc_path = Path::new("docker-compose.yml");
33    if dc_path.exists() {
34        println!("  {} {} already exists, skipping", style("⚠").yellow(), style("docker-compose.yml").dim());
35    } else {
36        fs::write(dc_path, render_template(include_str!("../templates/docker_compose_yml.txt"), replacements))
37            .context("Failed to write docker-compose.yml")?;
38        println!("  {} {}", style("✓").green(), style("docker-compose.yml").dim());
39    }
40
41    println!();
42    println!("{} {}", Emoji("✨", ""), style("Docker files generated!").green());
43    println!();
44    println!("  {} {} docker-compose up -d", style("→").cyan(), style("Start services").dim());
45    println!();
46
47    Ok(())
48}
49
50fn render_template(content: &str, replacements: &[(&str, &str)]) -> String {
51    let mut result = content.to_string();
52    for (placeholder, value) in replacements {
53        result = result.replace(placeholder, value);
54    }
55    result
56}