Skip to content

megahomyak/pluginator

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

7 Commits
 
 
 
 
 
 
 
 

Repository files navigation

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);

About

Rust plugins made easier

Resources

Stars

Watchers

Forks

Packages

No packages published

Languages