use std::sync::RwLock;
use rustc_hash::FxHashMap;
pub trait VarsStore: Send + Sync {
fn get(&self, name: &str) -> Option<String>;
fn set(&self, name: &str, value: String);
fn has(&self, name: &str) -> bool;
fn delete(&self, name: &str);
fn keys(&self) -> Vec<String>;
}
#[derive(Default)]
pub struct InMemoryVars {
inner: RwLock<FxHashMap<String, String>>,
}
impl InMemoryVars {
#[must_use]
pub fn new() -> Self {
Self::default()
}
}
impl VarsStore for InMemoryVars {
fn get(&self, name: &str) -> Option<String> {
self.inner.read().ok().and_then(|guard| guard.get(name).cloned())
}
fn set(&self, name: &str, value: String) {
if let Ok(mut guard) = self.inner.write() {
guard.insert(name.to_string(), value);
}
}
fn has(&self, name: &str) -> bool {
self.inner.read().ok().is_some_and(|guard| guard.contains_key(name))
}
fn delete(&self, name: &str) {
if let Ok(mut guard) = self.inner.write() {
guard.remove(name);
}
}
fn keys(&self) -> Vec<String> {
self
.inner
.read()
.map(|guard| guard.keys().cloned().collect())
.unwrap_or_default()
}
}