rusta-cli 1.0.16

macOS arm64 CLI for creating and managing Ubuntu VMs on Tart
use std::path::PathBuf;

use crate::runtime;

fn home() -> PathBuf {
    std::env::var_os("HOME").map(PathBuf::from).expect("HOME is not set")
}

pub fn state_dir() -> PathBuf {
    runtime::state_root_override().unwrap_or_else(|| home().join(".local/share/rusta"))
}

pub fn state_file() -> PathBuf {
    state_dir().join("state.toml")
}

pub fn provision_dir() -> PathBuf {
    state_dir().join("provision")
}

pub fn provision_script(vm: &str) -> PathBuf {
    provision_dir().join(format!("{vm}.sh"))
}

pub fn run_dir() -> PathBuf {
    state_dir().join("run")
}

pub fn pid_file(vm: &str) -> PathBuf {
    run_dir().join(format!("{vm}.pid"))
}

pub fn ensure_dirs() -> std::io::Result<()> {
    std::fs::create_dir_all(state_dir())?;
    std::fs::create_dir_all(provision_dir())?;
    std::fs::create_dir_all(run_dir())?;
    Ok(())
}

pub fn ssh_dir() -> PathBuf {
    runtime::ssh_dir_override().unwrap_or_else(|| home().join(".ssh"))
}

pub fn ssh_config() -> PathBuf {
    ssh_dir().join("config")
}

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn paths_compose_from_state_dir() {
        let s = state_dir();
        assert_eq!(state_file(), s.join("state.toml"));
        assert_eq!(provision_dir(), s.join("provision"));
        assert_eq!(provision_script("vm"), s.join("provision/vm.sh"));
        assert_eq!(run_dir(), s.join("run"));
        assert_eq!(pid_file("vm"), s.join("run/vm.pid"));
        assert_eq!(ssh_config(), ssh_dir().join("config"));
    }
}