use car_registry::{AgentEntry, AgentRegistry};
use std::path::PathBuf;
fn open(registry_path: Option<PathBuf>) -> Result<AgentRegistry, String> {
match registry_path {
Some(p) => AgentRegistry::open(p).map_err(|e| e.to_string()),
None => AgentRegistry::user_default().map_err(|e| e.to_string()),
}
}
pub fn register_agent(entry_json: &str, registry_path: Option<PathBuf>) -> Result<String, String> {
let entry: AgentEntry =
serde_json::from_str(entry_json).map_err(|e| format!("invalid AgentEntry JSON: {e}"))?;
let reg = open(registry_path)?;
reg.register(&entry).map_err(|e| e.to_string())?;
Ok("null".to_string())
}
pub fn agent_heartbeat(name: &str, registry_path: Option<PathBuf>) -> Result<String, String> {
let reg = open(registry_path)?;
let refreshed = reg.heartbeat(name).map_err(|e| e.to_string())?;
Ok(serde_json::json!({"refreshed": refreshed}).to_string())
}
pub fn unregister_agent(name: &str, registry_path: Option<PathBuf>) -> Result<String, String> {
let reg = open(registry_path)?;
reg.unregister(name).map_err(|e| e.to_string())?;
Ok("null".to_string())
}
pub fn list_agents(registry_path: Option<PathBuf>) -> Result<String, String> {
let reg = open(registry_path)?;
let entries = reg.list().map_err(|e| e.to_string())?;
serde_json::to_string(&entries).map_err(|e| e.to_string())
}
pub fn reap_stale_agents(
max_age_secs: u64,
registry_path: Option<PathBuf>,
) -> Result<String, String> {
let reg = open(registry_path)?;
let reaped = reg.reap_stale(max_age_secs).map_err(|e| e.to_string())?;
serde_json::to_string(&reaped).map_err(|e| e.to_string())
}