use crate::plugins::*;
use std::any::Any;
use std::marker::PhantomData;
type FunctionalActionsRegistrar = Box<dyn Fn(FunctionalPluginActions) -> FunctionalPluginActions>;
type ControlActionsRegistrar = Box<dyn Fn(ControlPluginActions) -> ControlPluginActions>;
#[derive(PartialEq, Eq, Debug)]
pub enum PluginEnv {
Client,
Server,
Both,
}
pub struct Plugin<D: Any + Send + Sync> {
pub name: String,
pub functional_actions_registrar: FunctionalActionsRegistrar,
pub control_actions_registrar: ControlActionsRegistrar,
pub env: PluginEnv,
plugin_data_type: PhantomData<D>,
}
impl<D: Any + Send + Sync> std::fmt::Debug for Plugin<D> {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.debug_struct("Plugin")
.field("name", &self.name)
.field("env", &self.env)
.finish()
}
}
impl<D: Any + Send + Sync> Plugin<D> {
pub fn new(
name: &str,
functional_actions_registrar: impl Fn(FunctionalPluginActions) -> FunctionalPluginActions
+ 'static,
control_actions_registrar: impl Fn(ControlPluginActions) -> ControlPluginActions + 'static,
env: PluginEnv,
) -> Self {
Self {
name: name.to_string(),
functional_actions_registrar: Box::new(functional_actions_registrar),
control_actions_registrar: Box::new(control_actions_registrar),
env,
plugin_data_type: PhantomData::default(),
}
}
}