diff --git a/crates/xy/src/daemon/mod.rs b/crates/xy/src/daemon/mod.rs index 5e01e5c..3e003fe 100644 --- a/crates/xy/src/daemon/mod.rs +++ b/crates/xy/src/daemon/mod.rs @@ -1,4 +1,6 @@ use crate::paths::Paths; use anyhow::{bail, Result}; +pub mod registry; + pub async fn run(_paths: Paths) -> Result<()> { bail!("not implemented") } diff --git a/crates/xy/src/daemon/registry.rs b/crates/xy/src/daemon/registry.rs new file mode 100644 index 0000000..0fd9b45 --- /dev/null +++ b/crates/xy/src/daemon/registry.rs @@ -0,0 +1,39 @@ +use std::collections::HashMap; +use std::sync::Arc; +use tokio::sync::RwLock; +use xy_supervisor::SupervisorHandle; + +#[derive(Clone)] +pub struct Entry { + pub handle: SupervisorHandle, + pub config_hash: u64, +} + +#[derive(Clone, Default)] +pub struct Registry { + inner: Arc>>, +} + +impl Registry { + pub fn new() -> Self { Self::default() } + pub async fn insert(&self, name: String, entry: Entry) { + self.inner.write().await.insert(name, entry); + } + pub async fn remove(&self, name: &str) -> Option { + self.inner.write().await.remove(name) + } + pub async fn get(&self, name: &str) -> Option { + self.inner.read().await.get(name).cloned() + } + pub async fn names(&self) -> Vec { + let g = self.inner.read().await; + let mut v: Vec = g.keys().cloned().collect(); + v.sort(); v + } + pub async fn snapshot(&self) -> Vec<(String, Entry)> { + let g = self.inner.read().await; + let mut v: Vec<_> = g.iter().map(|(k, v)| (k.clone(), v.clone())).collect(); + v.sort_by(|a, b| a.0.cmp(&b.0)); + v + } +}