1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
use std::any::Any;
use std::collections::HashMap;

/// A runner function, which takes action data and plugin data.
pub type Runner<A, R> = Box<dyn Fn(&A, &dyn Any) -> R>;

/// A trait for the interface for a plugin action, which abstracts whether it's a functional or a control action.
pub trait PluginAction<A, R, R2> {
    /// Runs the action. This takes data that the action should expect, along with a map of plugins to their data.
    fn run(&self, action_data: A, plugin_data: &HashMap<String, Box<dyn Any>>) -> R2;
    /// Registers a plugin that takes this action.
    ///
    /// # Panics
    /// If the action type can only be taken by one plugin, and one has already been set, this may panic (e.g. for control actions),
    /// as this is a critical, unrecoverable error that Perseus doesn't need to do anything after. If a plugin registration fails,
    /// we have to assume that all work in the engine may be not what the user intended.
    fn register_plugin(&mut self, name: &str, runner: impl Fn(&A, &dyn Any) -> R + 'static);
    /// Same as `.register_plugin()`, but takes a prepared runner in a `Box`.
    fn register_plugin_box(&mut self, name: &str, runner: Runner<A, R>);
}