fn run(
        &self,
        action_data: A,
        plugin_data: &HashMap<String, Box<dyn Any + Send + Sync>>,
    ) -> Result<Option<R>, PluginError> {
        // If no runner is defined, this won't have any effect (same as functional
        // actions with no registered runners)
        self.runner
            .as_ref()
            .map(|runner| {
                runner(
                    &action_data,
                    // We must have data registered for every active plugin (even if it's empty)
                    &**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,
                })
            })
            // Turn `Option<Result<T, E>>` -> `Result<Option<T>, E>`
            .transpose()
    }
Runs the single registered runner for the action.
packages/perseus/src/plugins/control.rs