lade 0.17.2

Automatically load secrets from your preferred vault as environment variables, and clear them once your shell command is over.
use std::process::{Command, Stdio};

fn repo_root() -> &'static str {
    env!("CARGO_MANIFEST_DIR")
}

fn has_cmd(cmd: &str) -> bool {
    Command::new("sh")
        .args(["-c", &format!("command -v {cmd} >/dev/null 2>&1")])
        .status()
        .is_ok_and(|s| s.success())
}

fn require_cmds(cmds: &[&str]) {
    let missing = cmds
        .iter()
        .copied()
        .filter(|cmd| !has_cmd(cmd))
        .collect::<Vec<_>>();
    assert!(
        missing.is_empty(),
        "missing required commands: {}",
        missing.join(", ")
    );
}

fn docker_ready() -> bool {
    Command::new("docker")
        .arg("info")
        .stdout(Stdio::null())
        .stderr(Stdio::null())
        .status()
        .is_ok_and(|s| s.success())
}

fn path_env() -> String {
    std::env::var("PATH").unwrap_or_default()
}

fn run_cmd(cmd: &str, args: &[&str]) {
    let output = Command::new(cmd)
        .args(args)
        .current_dir(repo_root())
        .output()
        .expect("spawn command");
    if output.status.success() {
        return;
    }
    panic!(
        "{cmd} {:?} failed:\nstdout:\n{}\nstderr:\n{}",
        args,
        String::from_utf8_lossy(&output.stdout),
        String::from_utf8_lossy(&output.stderr)
    );
}

#[test]
fn vault_shell_scripts_run_from_cargo_test_workspace() {
    require_cmds(&["bash", "zsh", "fish", "vault", "docker"]);
    assert!(docker_ready(), "docker daemon is required");

    let path = path_env();
    run_cmd(
        "env",
        &[
            "-i",
            &format!("PATH={path}"),
            "VAULT_TOKEN=token",
            "LADE_VAULT_HTTP=1",
            "bash",
            "tests/test_vault.bash",
        ],
    );
    run_cmd(
        "env",
        &[
            "-i",
            &format!("PATH={path}"),
            "VAULT_TOKEN=token",
            "LADE_VAULT_HTTP=1",
            "zsh",
            "tests/test_vault.zsh",
        ],
    );
    run_cmd(
        "env",
        &[
            "-i",
            &format!("PATH={path}"),
            "VAULT_TOKEN=token",
            "LADE_VAULT_HTTP=1",
            "fish",
            "tests/test_vault.fish",
        ],
    );
}