use std::{
any::Any,
collections::HashMap,
sync::{Arc, RwLock, RwLockReadGuard, RwLockWriteGuard},
};
#[derive(Debug)]
pub struct Args {
args: HashMap<String, Arc<RwLock<dyn Any + Send + Sync>>>,
}
impl Args {
pub fn new() -> Self {
Args {
args: HashMap::new(),
}
}
pub fn add_arg(&mut self, name: &str, arg: Arc<RwLock<dyn Any + Send + Sync>>) -> &mut Self {
self.args.insert(name.to_string(), arg);
self
}
pub fn arg(&self, name: &str) -> Box<RwLockReadGuard<dyn Any + Send + Sync + 'static>> {
let b = self
.args
.get(name)
.expect(&format!("Unable to get argument {}", name));
let l = b.read().unwrap();
Box::new(l)
}
pub fn arg_mut(&self, name: &str) -> Box<RwLockWriteGuard<dyn Any + Send + Sync + 'static>> {
let b = self
.args
.get(name)
.expect(&format!("Unable to get argument {}", name));
let l = b.write().unwrap();
Box::new(l)
}
}