#plugin #plugy #inventory #wasi

plugy-macros

plugy使您能够使用Rust和WASM构建无差别的动态插件系统

6个版本

0.3.1 2023年12月14日
0.3.0 2023年12月3日
0.2.1 2023年8月31日
0.1.1 2023年8月9日

#inventory中排名32

每月下载量50
plugy中使用

MIT/Apache

21KB
315

GitHub Actions GitHub Releases

plugy

plugy是一个插件系统,旨在使Rust插件无缝集成到您的应用程序中。它提供了一个运行时环境,用于加载和执行用WebAssembly(Wasm)编写的插件,使您的Rust项目具有动态扩展性和模块化。

特性

  • 加载和执行编译为WASM的插件。
  • 灵活的插件运行时管理。
  • 插件函数调用是异步的。
  • 用于生成插件接口的简单宏。

入门

要在Rust项目中使用plugy,请按照以下步骤操作

  1. 编写您的插件特质
#[plugy::plugin]
trait Greeter {
    fn greet(&self) -> String;
}
  1. 编写您的第一个插件实现
#[derive(Debug, Deserialize)]
struct FooPlugin;

#[plugin_impl]
impl Greeter for FooPlugin {
    fn greet(&self) -> String {
        "Hello From Foo Plugin".to_owned()
    }
}

编译它!

cargo build --target wasm32-unknown-unknown
  1. 导入并运行
#[plugin_import(file = "target/wasm32-unknown-unknown/debug/foo_plugin.wasm")]
struct FooPlugin;

#[tokio::main]
async fn main() {
    let runtime = Runtime::<Box<dyn Greeter>>::new().unwrap();
    let handle = runtime.load(FooPlugin).await.unwrap();
    let res = handle.greet().await;
    assert_eq!(res, "Hello From Foo Plugin")
}

您就设置好了!

示例

查看示例目录,了解plugy的示例用法。

里程碑

状态 目标 标签
插件函数接受多个参数(n-ary) 完成
在主机和客户端之间传递上下文 完成

功能

Plugy由三个基本crate组成,每个crate在用Rust和WebAssembly构建动态插件系统时扮演着不同的角色

  • 核心:该crate包含位操作实用工具和客户端模块等基本组件,是Plugy功能的基础。

  • 运行时:运行时crate负责执行您的插件系统,允许插件无缝集成到您的应用程序中。

  • 宏:宏crate提供了一系列宏,简化了绑定和接口的生成,简化了与动态插件一起工作的过程。

贡献

欢迎为plugy做出贡献!如果您发现了一个错误或想提出一个新的功能,请随时创建一个问题或提交一个pull请求。

感谢

许可证

本项目采用MIT OR Apache-2.0许可证。

依赖

~1.2–1.7MB
~33K SLoC