Crates.io | jude |
lib.rs | jude |
version | 0.1.2 |
source | src |
created_at | 2024-05-04 20:39:09.224897 |
updated_at | 2024-05-09 10:55:52.059031 |
description | dynamic reloading of shared libraries |
homepage | https://github.com/solomatovs/jude |
repository | https://github.com/solomatovs/jude |
max_upload_size | |
id | 1229827 |
size | 8,448,970 |
Jude this is a small macros for the libloading that makes it easier to write plugins Jude depends libloading only
You can write the structure without implementation, and load the functionality from the plugin
// examples/jude_plugin.rs
#[repr(C)]
#[derive(Clone, Debug)]
pub struct JudePlugin {
pub word: String,
pub one: u8,
pub two: f32,
pub tree: bool,
}
#[no_mangle]
pub fn who_am_i(_self: &JudePlugin) {
println!("my name is Jude");
}
// examples/jude_plugin_app.rs
use std::{ffi::OsString, thread, time::Duration};
use jude::jude;
jude! (
#[repr(C)]
#[derive(Debug, Clone)]
pub struct JudePlugin {
pub word: String = String::from("example string"),
pub one: u8 = 1,
pub two: f32 = 2.0,
pub tree: bool = true,
pub fn who_am_i(&self),
}
);
fn main() -> Result<(), libloading::Error> {
let mut lib =
JudePlugin::_load_from(OsString::from("target/debug/examples/libjude_plugin.dylib"))?;
loop {
if let Ok(true) = lib._is_changed() {
if let Err(e) = lib._reload() {
println!("{:?}", e);
break;
}
}
lib.who_am_i();
thread::sleep(Duration::from_secs(1));
}
Ok(())
}
# Cargo.toml
[dependencies]
jude = "0.1.*"
1, cargo build --examples
2. cargo run --example jude_plugin_app
3. change who_am_i func examples/jude_plugin.rs
4. cargo build --exmaples