use std::{path::PathBuf, time::SystemTime};
use serde::{Deserialize, Serialize};
use super::state::WorkspaceState;
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct DaemonStatus {
pub uptime_seconds: u64,
pub daemon_version: String,
pub memory: MemoryStatus,
pub workspaces: Vec<WorkspaceStatus>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[non_exhaustive]
pub struct MemoryStatus {
pub limit_bytes: u64,
pub current_bytes: u64,
pub reserved_bytes: u64,
pub high_water_bytes: u64,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct WorkspaceStatus {
pub index_root: PathBuf,
pub state: WorkspaceState,
pub pinned: bool,
pub current_bytes: u64,
pub high_water_bytes: u64,
pub last_good_at: Option<SystemTime>,
pub last_error: Option<String>,
pub retry_count: u32,
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn daemon_status_round_trips_through_json() {
let status = DaemonStatus {
uptime_seconds: 120,
daemon_version: "8.0.6".into(),
memory: MemoryStatus {
limit_bytes: 2 * 1024 * 1024 * 1024,
current_bytes: 450 * 1024 * 1024,
reserved_bytes: 0,
high_water_bytes: 1_200 * 1024 * 1024,
},
workspaces: vec![WorkspaceStatus {
index_root: PathBuf::from("/repos/example"),
state: WorkspaceState::Loaded,
pinned: true,
current_bytes: 320 * 1024 * 1024,
high_water_bytes: 890 * 1024 * 1024,
last_good_at: None,
last_error: None,
retry_count: 0,
}],
};
let json = serde_json::to_string(&status).expect("serialise");
let back: DaemonStatus = serde_json::from_str(&json).expect("round-trip");
assert_eq!(back, status);
}
}