pz 0.0.1

Agent-friendly process manager
use std::{env, path::PathBuf};

#[derive(Debug, Clone)]
pub struct RuntimePaths {
    pub socket: PathBuf,
    pub database: PathBuf,
}

impl RuntimePaths {
    pub fn default() -> Self {
        let runtime_dir = runtime_dir();
        let socket = runtime_dir.join("pz.sock");
        let state_dir = state_dir();
        let database = state_dir.join("pz.sqlite");

        Self { socket, database }
    }
}

fn runtime_dir() -> PathBuf {
    if let Some(path) = env::var_os("PZ_RUNTIME_DIR") {
        return PathBuf::from(path);
    }

    if let Some(path) = env::var_os("XDG_RUNTIME_DIR") {
        return PathBuf::from(path).join("pz");
    }

    let user = env::var("USER")
        .or_else(|_| env::var("LOGNAME"))
        .unwrap_or_else(|_| "unknown".to_owned());

    env::temp_dir().join(format!("pz-{user}"))
}

fn state_dir() -> PathBuf {
    if let Some(path) = env::var_os("PZ_STATE_DIR") {
        return PathBuf::from(path);
    }

    if let Some(path) = env::var_os("XDG_STATE_HOME") {
        return PathBuf::from(path).join("pz");
    }

    if cfg!(target_os = "macos") {
        if let Some(home) = home_dir() {
            return home.join("Library").join("Application Support").join("pz");
        }
    }

    if let Some(home) = home_dir() {
        return home.join(".local").join("state").join("pz");
    }

    runtime_dir()
}

fn home_dir() -> Option<PathBuf> {
    env::var_os("HOME").map(PathBuf::from)
}