pleme-fleet 0.1.4

NixOS fleet lifecycle CLI with DAG workflow orchestration
use anyhow::Result;
use std::process::Command;

use crate::targeting::ResolvedTargets;
use super::utils::*;

pub fn run(targets: &ResolvedTargets, dry_run: bool, show_trace: bool, skip_checks: bool) -> Result<()> {
    let flake = flake_dir();

    if targets.is_single() {
        let (name, _node) = &targets.nodes[0];
        deploy_single(&flake, name, dry_run, show_trace, skip_checks)
    } else {
        deploy_fleet(&flake, targets, dry_run, show_trace)
    }
}

fn deploy_single(flake: &str, name: &str, dry_run: bool, show_trace: bool, skip_checks: bool) -> Result<()> {
    if dry_run {
        log_info(&format!("Dry-run deploy to {} (deploy-rs)", name));
    } else {
        log_info(&format!("Deploying to {} (deploy-rs, magic rollback)", name));
    }

    let mut cmd = Command::new("deploy");
    if dry_run {
        cmd.arg("--dry-activate");
    }
    if skip_checks {
        cmd.arg("--skip-checks");
    }
    cmd.arg(format!("{flake}#{name}"));
    if show_trace {
        cmd.arg("--show-trace");
    }

    run_command(&mut cmd)?;

    if dry_run {
        log_success(&format!("{} dry-run complete", name));
    } else {
        log_success(&format!("{} deployed successfully", name));
    }
    Ok(())
}

fn deploy_fleet(flake: &str, targets: &ResolvedTargets, dry_run: bool, show_trace: bool) -> Result<()> {
    let names = targets.names();
    let on = names.join(",");

    if dry_run {
        log_info(&format!("Dry-run fleet build: {} (colmena)", on));
        let mut cmd = Command::new("colmena");
        cmd.arg("build");
        cmd.arg("--on").arg(&on);
        if show_trace {
            cmd.arg("--show-trace");
        }
        cmd.current_dir(flake);
        run_command(&mut cmd)?;
        log_success("Fleet dry-run build complete");
    } else {
        log_info(&format!("Fleet deploy: {} (colmena apply)", on));
        let mut cmd = Command::new("colmena");
        cmd.arg("apply");
        cmd.arg("--on").arg(&on);
        if show_trace {
            cmd.arg("--show-trace");
        }
        cmd.current_dir(flake);
        run_command(&mut cmd)?;
        log_success("Fleet deploy complete");
    }

    Ok(())
}