use parking_lot::RwLock;
use std::collections::HashMap;
use std::sync::OnceLock;
pub(crate) struct GroupMetadata {
inner: OnceLock<RwLock<HashMap<usize, HashMap<String, String>>>>,
}
impl GroupMetadata {
pub(crate) const fn new() -> Self {
Self {
inner: OnceLock::new(),
}
}
fn get_or_init(&self) -> &RwLock<HashMap<usize, HashMap<String, String>>> {
self.inner.get_or_init(|| RwLock::new(HashMap::new()))
}
pub(crate) fn insert(&self, idx: usize, metadata: HashMap<String, String>) {
self.get_or_init().write().insert(idx, metadata);
}
pub(crate) fn insert_kv(&self, idx: usize, key: String, value: String) {
self.get_or_init()
.write()
.entry(idx)
.or_default()
.insert(key, value);
}
pub(crate) fn load(&self, idx: usize) -> Option<HashMap<String, String>> {
self.inner.get().and_then(|m| m.read().get(&idx).cloned())
}
pub(crate) fn remove(&self, idx: usize) {
if let Some(m) = self.inner.get() {
m.write().remove(&idx);
}
}
pub(crate) fn snapshot(&self) -> Vec<(usize, HashMap<String, String>)> {
match self.inner.get() {
Some(m) => m.read().iter().map(|(k, v)| (*k, v.clone())).collect(),
None => Vec::new(),
}
}
}