kegani_cli/commands/
docker.rs1use anyhow::{Context, Result};
4use console::{style, Emoji};
5use std::fs;
6use std::path::Path;
7
8pub 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 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 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}