use crate::errors::{BindingResult};
use crate::dispatch::{OpDispatchFn};
use std::any::Any;
use std::fmt::Debug;
pub trait BindingInitContext {
fn register_op(
&self,
name: String,
dispatch: OpDispatchFn
) -> BindingResult<()>;
}
pub trait BindingPlugin: Any + Send + Sync + Debug {
fn name(&self) -> &'static str;
fn init(&self, context: &BindingInitContext) -> BindingResult<()>;
fn es_module_source(&self) -> String;
}
#[macro_export]
macro_rules! declare_binding_plugin {
($plugin_type:ty, $constructor:path) => {
#[no_mangle]
pub extern "C" fn _binding_plugin_create() -> *mut $crate::plugin::BindingPlugin {
let constructor: fn() -> $plugin_type = $constructor;
let object = constructor();
let boxed: Box<$crate::plugin::BindingPlugin> = Box::new(object);
Box::into_raw(boxed)
}
};
}