| Crates.io | zula-core |
| lib.rs | zula-core |
| version | 4.0.0 |
| created_at | 2023-08-21 12:59:54.233061+00 |
| updated_at | 2023-11-13 11:57:56.470182+00 |
| description | core shell object of zula |
| homepage | |
| repository | https://github.com/JamieH01/zula-core |
| max_upload_size | |
| id | 949976 |
| size | 11,787 |
zula-core is the core module of the zula shell.
zula-core contains the core functionality of the zula shell, and is required for writing
plugins. This api is experimental, and may introduce breaking changes.
To create a plugin, first initialize a library crate.
cargo new my_plugin --lib
Set the crate type to cdylib, and add zula-core as a dependency.
[lib]
crate-type = ["cdylib"]
[dependencies]
zula-core = "3.0.5"
Import the [Plugin] trait and implement it on your plugin type.
use zula-core::{Plugin, ShellState};
use std::error::Error;
pub struct MyPlugin;
impl Plugin for MyPlugin {
//since this function is called across abi boundaries, its important to include no_mangle so
//that rustc leaves the symbol as-is and can be called properly.
#[no_mangle]
fn init(&self) -> Box<dyn Plugin> {
Box::new(Self)
}
fn name(&self) -> &str {
"my_plugin"
}
fn call(&self, state: *mut ShellState) -> Result<(), Box<dyn Error>> {
println!("Hello, plugin!")
}
}
Run cargo build --release to build your plugin. The library file should be in target/release/lib<name>.so. This is the file that you'll put in your plugins folder.
Thats it! Run zula cfg inside zula to check that its loaded, and run plugin.<name> to use it. Due to weird ownership relationships, call has to take a raw pointer, so use it responsibly.