# Usage Use `plugin_trait!` and `plugin_implementation!` in different crates. Wrap the plugin trait with the `plugin_trait!` macro. A `load_plugin` function will be generated. It can load a plugin object from a static library. Wrap the plugin implementation with a `plugin_implementation!` macro. A `get_interface` function will be generated. Compile the crate as a static library to use the plugin. # Safety `load_plugin` is unsafe because you should pass the *correct* (matching) plugin trait as its first argument, otherwise undefined behavior will happen. This happens because it is impossible to determine the return value type of an interface getter in a static library. # Example * `app/src/main.rs`: ``` fn main() { let plugin = unsafe { app::load_plugin("plugins/libplugin1.so") }.unwrap(); plugin.print("hello"); } ``` * `app/src/lib.rs`: ``` pub trait Plugin: Sync + Send { fn print(&self, message: &str); } pluginator::plugin_trait!(Plugin); ``` * `plugin1/src/lib.rs`: ``` struct Plugin; impl app::Plugin for Plugin { fn print(&self, message: &str) { println!("{}", message); } } pluginator::plugin_implementation!(app::Plugin, Plugin); ```