1 个不稳定版本

0.1.0 2023年1月26日

#37 in #wasm-plugin


用于 scotch-host

MIT 许可证

16KB
365 代码行

Scotch

使用Rust创建WASM插件的库。Scotch允许您在WASM插件中传递复杂类型。它通过在宿主和客户端环境之间编码和解码复杂类型来实现。编码和解码由bincode@2.0.0-rc.2处理,因此您的类型需要实现bincode::Encodebincode::Decode特质。

无头模式

您可以通过禁用默认功能来启用无头模式,这应该会减少宿主二进制文件的大小。在无头模式下,您无法编译wasm字节码,需要依赖序列化的插件。请参阅WasmPluginBuilder::from_serializedWasmPluginBuilder::from_serialized_compressedWasmPlugin::serializeWasmPlugin::serialize_compress。带有*_compress*_compressed的函数使用flate2crate进行压缩/解压缩插件,要使用它们,您需要启用flate2特性。

安装

# In your main application
[dependenices]
scotch-host = "0.1"

# In your plugins
[dependencies]
scotch-guest = "0.1"

示例应用程序

// Define functions that your plugin exports.
#[scotch_host::guest_functions]
extern "C" {
    // To pass complex types you use references to them, not owned types.
    // The name must match with the name of the plugin function.
    pub fn add_up_list(nums: &Vec<i32>) -> i32;
}

// Create your plugin
let plugin = WasmPlugin::builder()
    .with_state(0)
    // PLUGIN_BYTES is a slice of your wasm plugin.
    .from_binary(PLUGIN_BYTES)?
    // This call caches exports of your plugin.
    .with_exports(make_exports![add_up_list])
    .finish()?;

// Call the function
let sum = plugin.function_unwrap::<add_up_list>()(&vec![1, 2, 3, 4, 5])?;
assert_eq!(sum, 15);

示例插件

// This is required.
scotch_guest::export_alloc!();

// Functions marked with `guest_function` will be exposed to the host.
// All complex types such as Vec, String, user-defined types must be passed by immutable reference.
#[scotch_guest::guest_function]
fn add_up_list(items: &Vec<i32>) -> i32 {
    items.iter().sum::<i32>()
}

更多完整的示例可以在这里找到

计划的功能

  • 改进过程宏的代码生成。
  • 可变引用。
  • WASI支持。

依赖项

~1.5MB
~35K SLoC