use std::collections::HashMap;
#[derive(Debug, Clone)]
pub struct ServiceInfo {
pid: u32,
port: u16,
metadata: HashMap<String, String>,
}
impl ServiceInfo {
pub fn new(pid: u32, port: u16) -> Self {
Self {
pid,
port,
metadata: HashMap::new(),
}
}
pub fn with_pid(pid: u32) -> Self {
Self {
pid,
port: 0,
metadata: HashMap::new(),
}
}
pub fn pid(&self) -> u32 {
self.pid
}
pub fn port(&self) -> u16 {
self.port
}
pub fn set_metadata(&mut self, key: impl Into<String>, value: impl Into<String>) {
self.metadata.insert(key.into(), value.into());
}
pub fn get_metadata(&self, key: &str) -> Option<&str> {
self.metadata.get(key).map(|s| s.as_str())
}
pub fn is_alive(&self) -> bool {
crate::process::is_alive(self.pid)
}
}
#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
pub(crate) struct ServiceInfoFile {
pub pid: u32,
pub port: u16,
#[serde(default)]
pub metadata: HashMap<String, String>,
#[serde(default)]
pub started_at: Option<String>,
}
impl From<&ServiceInfo> for ServiceInfoFile {
fn from(info: &ServiceInfo) -> Self {
Self {
pid: info.pid,
port: info.port,
metadata: info.metadata.clone(),
started_at: Some(chrono::Utc::now().to_rfc3339()),
}
}
}
impl From<ServiceInfoFile> for ServiceInfo {
fn from(file: ServiceInfoFile) -> Self {
Self {
pid: file.pid,
port: file.port,
metadata: file.metadata,
}
}
}