jude

Crates.iojude
lib.rsjude
version0.1.2
sourcesrc
created_at2024-05-04 20:39:09.224897
updated_at2024-05-09 10:55:52.059031
descriptiondynamic reloading of shared libraries
homepagehttps://github.com/solomatovs/jude
repositoryhttps://github.com/solomatovs/jude
max_upload_size
id1229827
size8,448,970
Solomatov Sergei (solomatovs)

documentation

https://github.com/solomatovs/jude

README

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

Code example

// 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(())
}

Usage

# Cargo.toml
[dependencies]
jude = "0.1.*"

Example build

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
Commit count: 24

cargo fmt