use std::sync::Arc; use crate::dynamic_data::script_handling::script::{Script, ScriptContainer}; use crate::dynamic_data::script_handling::script_set::ScriptSet; use crate::{PkmnResult, StringKey}; /// This trait adds a bunch of helper functions to deal with volatile scripts on a struct. pub trait VolatileScriptsOwner { /// Return the [`ScriptSet`] that are our volatile scripts. fn volatile_scripts(&self) -> &Arc; /// Loads a volatile script by name. fn load_volatile_script(&self, key: &StringKey) -> PkmnResult>>; /// Check if a volatile script with given name exists. fn has_volatile_script(&self, key: &StringKey) -> bool { self.volatile_scripts().has(key) } /// Gets a volatile script by name. fn get_volatile_script(&self, key: &StringKey) -> Option { self.volatile_scripts().get(key) } /// Adds a volatile script by name. fn add_volatile_script(&self, key: &StringKey) -> PkmnResult> { self.volatile_scripts() .stack_or_add(key, &|| self.load_volatile_script(key)) } /// Adds a volatile script by name. fn add_volatile_script_with_script(&self, script: Arc) -> PkmnResult> { self.volatile_scripts() .stack_or_add(&script.name().clone(), &|| Ok(Some(script.clone()))) } /// Removes a volatile script by name. fn remove_volatile_script(&self, key: &StringKey) { self.volatile_scripts().remove(key) } }