2024-02-25 18:49:26 +00:00
|
|
|
use std::{
|
|
|
|
collections::BTreeMap,
|
|
|
|
sync::{Arc, RwLock},
|
|
|
|
};
|
|
|
|
|
2024-02-28 22:49:46 +00:00
|
|
|
use crate::{abstract_tree::Identifier, error::RwLockPoisonError, Value};
|
2024-02-25 18:49:26 +00:00
|
|
|
|
|
|
|
pub struct Context {
|
2024-02-28 22:49:46 +00:00
|
|
|
inner: Arc<RwLock<BTreeMap<Identifier, Value>>>,
|
2024-02-25 18:49:26 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
impl Context {
|
|
|
|
pub fn new() -> Self {
|
|
|
|
Self {
|
|
|
|
inner: Arc::new(RwLock::new(BTreeMap::new())),
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2024-02-28 22:49:46 +00:00
|
|
|
pub fn with_values(values: BTreeMap<Identifier, Value>) -> Self {
|
2024-02-25 18:49:26 +00:00
|
|
|
Self {
|
|
|
|
inner: Arc::new(RwLock::new(values)),
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2024-02-28 22:49:46 +00:00
|
|
|
pub fn get(&self, identifier: &Identifier) -> Result<Option<Value>, RwLockPoisonError> {
|
|
|
|
let value = self.inner.read()?.get(identifier).cloned();
|
2024-02-25 18:49:26 +00:00
|
|
|
|
|
|
|
Ok(value)
|
|
|
|
}
|
|
|
|
|
2024-02-28 22:49:46 +00:00
|
|
|
pub fn set(&self, identifier: Identifier, value: Value) -> Result<(), RwLockPoisonError> {
|
|
|
|
self.inner.write()?.insert(identifier, value);
|
2024-02-25 18:49:26 +00:00
|
|
|
|
|
|
|
Ok(())
|
|
|
|
}
|
|
|
|
}
|