A lot more work on a bunch of different parts of the system.

This commit is contained in:
2022-06-11 17:22:46 +02:00
parent 10e93949e4
commit 6e8f4dd4a5
35 changed files with 735 additions and 197 deletions

View File

@@ -1,11 +1,11 @@
use crate::dynamic_data::script_handling::script::Script;
use crate::PkmnResult;
use crate::{PkmnResult, StringKey};
use indexmap::IndexMap;
use std::sync::Arc;
#[derive(Debug, Default)]
pub struct ScriptSet {
scripts: IndexMap<String, Arc<Box<dyn Script>>>,
scripts: IndexMap<StringKey, Arc<Box<dyn Script>>>,
}
impl ScriptSet {
@@ -15,33 +15,37 @@ impl ScriptSet {
return existing.clone();
}
let arc = Arc::new(script);
self.scripts.insert(arc.name().to_string(), arc.clone());
self.scripts.insert(arc.name().clone(), arc.clone());
self.scripts.last().unwrap().1.clone()
}
pub fn stack_or_add<'b, F>(
&mut self,
key: &str,
key: &StringKey,
instantiation: &'b F,
) -> PkmnResult<Arc<Box<dyn Script>>>
) -> PkmnResult<Option<Arc<Box<dyn Script>>>>
where
F: Fn() -> PkmnResult<Box<dyn Script>>,
F: Fn() -> PkmnResult<Option<Box<dyn Script>>>,
{
if let Some(existing) = self.scripts.get(key) {
existing.stack();
return Ok(existing.clone());
return Ok(Some(existing.clone()));
}
let script = instantiation()?;
let arc = Arc::new(script);
self.scripts.insert(arc.name().to_string(), arc.clone());
Ok(self.scripts.last().unwrap().1.clone())
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)
}
}
pub fn get(&self, key: &str) -> Option<&Arc<Box<dyn Script>>> {
pub fn get(&self, key: &StringKey) -> Option<&Arc<Box<dyn Script>>> {
self.scripts.get(key)
}
pub fn remove(&mut self, key: &str) {
pub fn remove(&mut self, key: &StringKey) {
let value = self.scripts.shift_remove(key);
if let Some(script) = value {
script.on_remove();
@@ -55,7 +59,7 @@ impl ScriptSet {
self.scripts.clear();
}
pub fn has(&self, key: &str) -> bool {
pub fn has(&self, key: &StringKey) -> bool {
self.scripts.contains_key(key)
}