use crate::errors::PluginError;
use crate::plugins::*;
use std::any::Any;
use std::collections::HashMap;
pub struct ControlPluginAction<A, R> {
controller_name: String,
runner: Option<Runner<A, R>>,
}
impl<A, R> PluginAction<A, R, Option<R>> for ControlPluginAction<A, R> {
fn run(
&self,
action_data: A,
plugin_data: &HashMap<String, Box<dyn Any + Send + Sync>>,
) -> Result<Option<R>, PluginError> {
self.runner
.as_ref()
.map(|runner| {
runner(
&action_data,
&**plugin_data.get(&self.controller_name).unwrap_or_else(|| {
panic!(
"no plugin data for registered plugin {}",
&self.controller_name
)
}),
)
.map_err(|err| PluginError {
name: self.controller_name.to_string(),
source: err,
})
})
.transpose()
}
fn register_plugin(
&mut self,
name: &str,
runner: impl Fn(&A, &(dyn Any + Send + Sync)) -> Result<R, Box<dyn std::error::Error + Send + Sync>>
+ Send
+ Sync
+ 'static,
) {
self.register_plugin_box(name, Box::new(runner))
}
fn register_plugin_box(&mut self, name: &str, runner: Runner<A, R>) {
if self.runner.is_some() {
panic!("attempted to register runner from plugin '{}' for control action that already had a registered runner from plugin '{}' (these plugins conflict, see the book for further details)", name, self.controller_name);
}
self.controller_name = name.to_string();
self.runner = Some(runner);
}
}
impl<A, R> Default for ControlPluginAction<A, R> {
fn default() -> Self {
Self {
controller_name: String::default(),
runner: None,
}
}
}
impl<A, R> std::fmt::Debug for ControlPluginAction<A, R> {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.debug_struct("ControlPluginAction")
.field("controller_name", &self.controller_name)
.finish_non_exhaustive()
}
}
#[derive(Default, Debug)]
pub struct ControlPluginActions {
pub settings_actions: ControlPluginSettingsActions,
pub build_actions: ControlPluginBuildActions,
pub export_actions: ControlPluginExportActions,
pub server_actions: ControlPluginServerActions,
pub client_actions: ControlPluginClientActions,
}
#[derive(Default, Debug)]
pub struct ControlPluginSettingsActions {
pub set_immutable_store:
ControlPluginAction<crate::stores::ImmutableStore, crate::stores::ImmutableStore>,
pub set_locales: ControlPluginAction<crate::i18n::Locales, crate::i18n::Locales>,
pub set_app_root: ControlPluginAction<(), String>,
pub html_shell_actions: ControlPluginHtmlShellActions,
}
#[derive(Default, Debug)]
pub struct ControlPluginHtmlShellActions {
pub set_shell: ControlPluginAction<(), String>,
}
#[derive(Default, Debug)]
pub struct ControlPluginBuildActions {}
#[derive(Default, Debug)]
pub struct ControlPluginExportActions {}
#[derive(Default, Debug)]
pub struct ControlPluginServerActions {}
#[derive(Default, Debug)]
pub struct ControlPluginClientActions {}