lmrc-cli 0.3.0

CLI tool for scaffolding LMRC Stack infrastructure projects
use std::env;
use std::fs;
use std::path::PathBuf;

fn main() {
    // Tell Cargo to re-run this build script if Cargo.toml changes
    println!("cargo:rerun-if-changed=Cargo.toml");

    // Read the CLI's own Cargo.toml
    let manifest_dir = PathBuf::from(env::var("CARGO_MANIFEST_DIR").unwrap());
    let cli_cargo_toml = manifest_dir.join("Cargo.toml");

    let content = fs::read_to_string(&cli_cargo_toml).expect("Failed to read Cargo.toml");

    let cargo_toml: toml::Value = toml::from_str(&content).expect("Failed to parse Cargo.toml");

    // Read the dependency version from package.metadata.lmrc.dep-version
    let dep_version_full = cargo_toml
        .get("package")
        .and_then(|p| p.get("metadata"))
        .and_then(|m| m.get("lmrc"))
        .and_then(|l| l.get("dep-version"))
        .and_then(|v| v.as_str())
        .expect("package.metadata.lmrc.dep-version not found in Cargo.toml");

    // Extract major.minor (e.g., "0.2.8" -> "0.2")
    let parts: Vec<&str> = dep_version_full.split('.').collect();
    let dep_version = if parts.len() >= 2 {
        format!("{}.{}", parts[0], parts[1])
    } else {
        dep_version_full.to_string()
    };

    // List of LMRC crates
    let crates = [
        "lmrc-gitlab",
        "lmrc-hetzner",
        "lmrc-k3s",
        "lmrc-cloudflare",
        "lmrc-postgres",
        "lmrc-ssh",
        "lmrc-docker",
        "lmrc-kubernetes",
        "lmrc-pipeline",
    ];

    // Generate output file
    let out_dir = env::var("OUT_DIR").unwrap();
    let dest_path = PathBuf::from(out_dir).join("versions.rs");

    let mut output = String::new();
    output.push_str("// Auto-generated at compile time from Cargo.toml metadata\n");
    output.push_str("// DO NOT EDIT MANUALLY\n\n");

    // Generate constants for all crates using the dep-version
    for crate_name in &crates {
        let const_name = crate_name.replace("-", "_").to_uppercase();
        output.push_str(&format!(
            "pub const {}_VERSION: &str = \"{}\";\n",
            const_name, dep_version
        ));
    }

    fs::write(&dest_path, output).expect("Failed to write versions.rs");
}