2022-06-03 14:35:18 +00:00
|
|
|
use crate::dynamic_data::script_handling::script::Script;
|
2022-06-11 15:22:46 +00:00
|
|
|
use crate::{PkmnResult, StringKey};
|
2022-06-06 11:54:59 +00:00
|
|
|
use indexmap::IndexMap;
|
|
|
|
use std::sync::Arc;
|
2022-06-03 14:35:18 +00:00
|
|
|
|
2022-06-06 11:54:59 +00:00
|
|
|
#[derive(Debug, Default)]
|
|
|
|
pub struct ScriptSet {
|
2022-06-11 15:22:46 +00:00
|
|
|
scripts: IndexMap<StringKey, Arc<Box<dyn Script>>>,
|
2022-06-06 11:54:59 +00:00
|
|
|
}
|
2022-06-03 14:35:18 +00:00
|
|
|
|
|
|
|
impl ScriptSet {
|
2022-06-06 11:54:59 +00:00
|
|
|
pub fn add(&mut self, script: Box<dyn Script>) -> Arc<Box<dyn Script>> {
|
|
|
|
if let Some(existing) = self.scripts.get(script.name()) {
|
|
|
|
existing.stack();
|
|
|
|
return existing.clone();
|
|
|
|
}
|
|
|
|
let arc = Arc::new(script);
|
2022-06-11 15:22:46 +00:00
|
|
|
self.scripts.insert(arc.name().clone(), arc.clone());
|
2022-06-06 11:54:59 +00:00
|
|
|
self.scripts.last().unwrap().1.clone()
|
|
|
|
}
|
|
|
|
|
|
|
|
pub fn stack_or_add<'b, F>(
|
|
|
|
&mut self,
|
2022-06-11 15:22:46 +00:00
|
|
|
key: &StringKey,
|
2022-06-06 11:54:59 +00:00
|
|
|
instantiation: &'b F,
|
2022-06-11 15:22:46 +00:00
|
|
|
) -> PkmnResult<Option<Arc<Box<dyn Script>>>>
|
2022-06-06 11:54:59 +00:00
|
|
|
where
|
2022-06-11 15:22:46 +00:00
|
|
|
F: Fn() -> PkmnResult<Option<Box<dyn Script>>>,
|
2022-06-06 11:54:59 +00:00
|
|
|
{
|
|
|
|
if let Some(existing) = self.scripts.get(key) {
|
|
|
|
existing.stack();
|
2022-06-11 15:22:46 +00:00
|
|
|
return Ok(Some(existing.clone()));
|
2022-06-06 11:54:59 +00:00
|
|
|
}
|
|
|
|
let script = instantiation()?;
|
2022-06-11 15:22:46 +00:00
|
|
|
if let Some(script) = script {
|
|
|
|
let arc = Arc::new(script);
|
|
|
|
self.scripts.insert(arc.name().clone(), arc.clone());
|
|
|
|
Ok(Some(self.scripts.last().unwrap().1.clone()))
|
|
|
|
} else {
|
|
|
|
Ok(None)
|
|
|
|
}
|
2022-06-06 11:54:59 +00:00
|
|
|
}
|
|
|
|
|
2022-06-11 15:22:46 +00:00
|
|
|
pub fn get(&self, key: &StringKey) -> Option<&Arc<Box<dyn Script>>> {
|
2022-06-06 11:54:59 +00:00
|
|
|
self.scripts.get(key)
|
|
|
|
}
|
|
|
|
|
2022-06-11 15:22:46 +00:00
|
|
|
pub fn remove(&mut self, key: &StringKey) {
|
2022-06-06 11:54:59 +00:00
|
|
|
let value = self.scripts.shift_remove(key);
|
|
|
|
if let Some(script) = value {
|
|
|
|
script.on_remove();
|
|
|
|
}
|
2022-06-03 14:35:18 +00:00
|
|
|
}
|
|
|
|
|
2022-06-06 11:54:59 +00:00
|
|
|
pub fn clear(&mut self) {
|
|
|
|
for script in &self.scripts {
|
|
|
|
script.1.on_remove();
|
|
|
|
}
|
|
|
|
self.scripts.clear();
|
|
|
|
}
|
|
|
|
|
2022-06-11 15:22:46 +00:00
|
|
|
pub fn has(&self, key: &StringKey) -> bool {
|
2022-06-06 11:54:59 +00:00
|
|
|
self.scripts.contains_key(key)
|
|
|
|
}
|
|
|
|
|
|
|
|
pub fn at(&self, index: usize) -> &Arc<Box<dyn Script>> {
|
|
|
|
&self.scripts[index]
|
|
|
|
}
|
|
|
|
|
|
|
|
pub fn count(&self) -> usize {
|
|
|
|
self.scripts.len()
|
2022-06-03 14:35:18 +00:00
|
|
|
}
|
|
|
|
}
|