use super::*;
#[cfg(engine)]
use crate::errors::Error;
use crate::errors::PluginError;
use std::any::Any;
use std::collections::HashMap;
#[cfg(engine)]
use std::sync::Arc;
pub struct FunctionalPluginAction<A, R> {
runners: HashMap<String, Runner<A, R>>,
}
impl<A, R> PluginAction<A, R, HashMap<String, R>> for FunctionalPluginAction<A, R> {
fn run(
&self,
action_data: A,
plugin_data: &HashMap<String, Box<dyn Any + Send + Sync>>,
) -> Result<HashMap<String, R>, PluginError> {
let mut returns = HashMap::new();
for (plugin_name, runner) in &self.runners {
let ret = runner(
&action_data,
&**plugin_data.get(plugin_name).unwrap_or_else(|| {
panic!("no plugin data for registered plugin {}", plugin_name)
}),
)
.map_err(|err| PluginError {
name: plugin_name.to_string(),
source: err,
})?;
returns.insert(plugin_name.to_string(), ret);
}
Ok(returns)
}
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>) {
self.runners.insert(name.to_string(), runner);
}
}
impl<A, R> Default for FunctionalPluginAction<A, R> {
fn default() -> Self {
Self {
runners: HashMap::default(),
}
}
}
impl<A, R> std::fmt::Debug for FunctionalPluginAction<A, R> {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.debug_struct("FunctionalPluginAction")
.field("runners", &"HashMap<String, Runner>")
.finish()
}
}
#[derive(Debug, Default)]
pub struct FunctionalPluginActions {
pub tinker: FunctionalPluginAction<(), ()>,
pub settings_actions: FunctionalPluginSettingsActions,
#[cfg(engine)]
pub build_actions: FunctionalPluginBuildActions,
#[cfg(engine)]
pub export_actions: FunctionalPluginExportActions,
#[cfg(engine)]
pub export_error_page_actions: FunctionalPluginExportErrorPageActions,
pub server_actions: FunctionalPluginServerActions,
pub client_actions: FunctionalPluginClientActions,
}
#[derive(Debug, Default)]
pub struct FunctionalPluginSettingsActions {
pub add_static_aliases: FunctionalPluginAction<(), HashMap<String, String>>,
pub html_shell_actions: FunctionalPluginHtmlShellActions,
}
#[derive(Default, Debug)]
pub struct FunctionalPluginHtmlShellActions {
pub add_to_head_before_boundary: FunctionalPluginAction<(), Vec<String>>,
pub add_to_scripts_before_boundary: FunctionalPluginAction<(), Vec<String>>,
pub add_to_head_after_boundary: FunctionalPluginAction<(), Vec<String>>,
pub add_to_scripts_after_boundary: FunctionalPluginAction<(), Vec<String>>,
pub add_to_before_content: FunctionalPluginAction<(), Vec<String>>,
pub add_to_after_content: FunctionalPluginAction<(), Vec<String>>,
}
#[cfg(engine)]
#[derive(Default, Debug)]
pub struct FunctionalPluginBuildActions {
pub before_build: FunctionalPluginAction<(), ()>,
pub after_successful_build: FunctionalPluginAction<(), ()>,
pub after_failed_build: FunctionalPluginAction<Arc<Error>, ()>,
}
#[cfg(engine)]
#[derive(Default, Debug)]
pub struct FunctionalPluginExportActions {
pub before_export: FunctionalPluginAction<(), ()>,
pub after_successful_build: FunctionalPluginAction<(), ()>,
pub after_failed_build: FunctionalPluginAction<Arc<Error>, ()>,
pub after_failed_export: FunctionalPluginAction<Arc<Error>, ()>,
pub after_failed_static_copy: FunctionalPluginAction<Arc<Error>, ()>,
pub after_failed_static_alias_dir_copy: FunctionalPluginAction<Arc<Error>, ()>,
pub after_failed_nested_static_alias_dir_creation: FunctionalPluginAction<Arc<Error>, ()>,
pub after_failed_static_alias_file_copy: FunctionalPluginAction<Arc<Error>, ()>,
pub after_successful_export: FunctionalPluginAction<(), ()>,
}
#[cfg(engine)]
#[derive(Default, Debug)]
pub struct FunctionalPluginExportErrorPageActions {
pub before_export_error_page: FunctionalPluginAction<(u16, String), ()>,
pub after_successful_export_error_page: FunctionalPluginAction<(), ()>,
pub after_failed_write: FunctionalPluginAction<Arc<Error>, ()>,
}
#[derive(Default, Debug)]
pub struct FunctionalPluginServerActions {
pub before_serve: FunctionalPluginAction<(), ()>,
}
#[derive(Default, Debug)]
pub struct FunctionalPluginClientActions {
pub start: FunctionalPluginAction<(), ()>,
pub crash: FunctionalPluginAction<(), ()>,
}