macro_rules! define_plugin {
($plugin_ty:ty, {
fn new() -> Self $new_body:block
fn init(&mut self, $ctx_param:ident : &PluginContext $(,)?) -> Result<(), Box<dyn std::error::Error + Send + Sync>> $init_body:block
fn name(&self) -> &str $name_body:block
fn version(&self) -> &str $version_body:block
fn process(
&self,
$msg_param:ident : &SpoeMessage $(,)?
) -> Result<ProcessingResult, Box<dyn std::error::Error + Send + Sync>> $process_body:block
fn config_schema(&self) -> Option<&str> $schema_body:block
}) => { ... };
($plugin_ty:ty, {
fn new() -> Self $new_body:block
fn init(&mut self, $ctx_param:ident : &PluginContext $(,)?) -> Result<(), Box<dyn std::error::Error + Send + Sync>> $init_body:block
fn name(&self) -> &str $name_body:block
fn version(&self) -> &str $version_body:block
fn process(
&self,
$msg_param:ident : &SpoeMessage $(,)?
) -> Result<ProcessingResult, Box<dyn std::error::Error + Send + Sync>> $process_body:block
}) => { ... };
}Expand description
Define a plugin with automatic panic safety and module export.
This macro generates the #[export_root_module] entry point and
wraps the process implementation in std::panic::catch_unwind
to prevent plugin panics from aborting the hub process.
§Usage
ⓘ
use haproxy_spoa_hub_plugin_api::*;
#[derive(Debug)]
struct MyPlugin;
define_plugin!(MyPlugin, {
fn new() -> Self {
MyPlugin
}
fn init(&mut self, _context: &PluginContext)
-> Result<(), Box<dyn std::error::Error + Send + Sync>>
{
Ok(())
}
fn name(&self) -> &str {
"my-plugin"
}
fn version(&self) -> &str {
"0.1.0"
}
fn process(
&self,
message: &SpoeMessage,
) -> Result<ProcessingResult, Box<dyn std::error::Error + Send + Sync>> {
Ok(ProcessingResult {
variables: vec![].into(),
})
}
});