aynur 0.2.1

A minimal pm2-like process guardian for local Rust binaries
use crate::app::AppConfig;
use crate::paths::AynurPaths;
use serde::{Deserialize, Serialize};
use std::collections::BTreeMap;
use std::io::{BufRead, BufReader, Write};
use std::os::unix::net::UnixStream;
use std::path::PathBuf;

#[derive(Clone, Debug, Deserialize, Serialize)]
#[serde(tag = "type", rename_all = "camelCase")]
pub enum DaemonRequest {
    Ping,
    Start {
        config: AppConfig,
    },
    Stop {
        name: String,
    },
    Restart {
        name: String,
    },
    Reload {
        name: String,
    },
    ReloadUpdateEnv {
        name: String,
        env: BTreeMap<String, String>,
    },
    List,
    Delete {
        name: String,
    },
}

#[derive(Clone, Debug, Deserialize, Serialize)]
#[serde(tag = "type", rename_all = "camelCase")]
pub enum DaemonResponse {
    Ok { message: String },
    Error { message: String },
    List { apps: Vec<AppStatusView> },
}

#[derive(Clone, Debug, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct AppStatusView {
    pub name: String,
    pub pid: Option<u32>,
    pub status: String,
    pub restarts: u32,
    pub uptime_seconds: Option<u64>,
    pub binary_path: PathBuf,
}

pub fn send_request(paths: &AynurPaths, request: &DaemonRequest) -> anyhow::Result<DaemonResponse> {
    let mut stream = UnixStream::connect(&paths.socket_path)?;
    let request_line = serde_json::to_string(request)?;
    stream.write_all(request_line.as_bytes())?;
    stream.write_all(b"\n")?;

    let mut reader = BufReader::new(stream);
    let mut response_line = String::new();
    reader.read_line(&mut response_line)?;
    let response = serde_json::from_str(&response_line)?;
    Ok(response)
}