ferridriver_script/
vars.rs1use std::sync::RwLock;
8
9use rustc_hash::FxHashMap;
10
11pub trait VarsStore: Send + Sync {
16 fn get(&self, name: &str) -> Option<String>;
17 fn set(&self, name: &str, value: String);
18 fn has(&self, name: &str) -> bool;
19 fn delete(&self, name: &str);
20 fn keys(&self) -> Vec<String>;
21}
22
23#[derive(Default)]
28pub struct InMemoryVars {
29 inner: RwLock<FxHashMap<String, String>>,
30}
31
32impl InMemoryVars {
33 #[must_use]
34 pub fn new() -> Self {
35 Self::default()
36 }
37}
38
39impl VarsStore for InMemoryVars {
40 fn get(&self, name: &str) -> Option<String> {
41 self.inner.read().ok().and_then(|guard| guard.get(name).cloned())
42 }
43
44 fn set(&self, name: &str, value: String) {
45 if let Ok(mut guard) = self.inner.write() {
46 guard.insert(name.to_string(), value);
47 }
48 }
49
50 fn has(&self, name: &str) -> bool {
51 self.inner.read().ok().is_some_and(|guard| guard.contains_key(name))
52 }
53
54 fn delete(&self, name: &str) {
55 if let Ok(mut guard) = self.inner.write() {
56 guard.remove(name);
57 }
58 }
59
60 fn keys(&self) -> Vec<String> {
61 self
62 .inner
63 .read()
64 .map(|guard| guard.keys().cloned().collect())
65 .unwrap_or_default()
66 }
67}