1 个不稳定版本
0.1.0 | 2023年1月26日 |
---|
#840 在 WebAssembly
7KB
152 行
Scotch
使用 Rust 创建 WASM 插件的库。Scotch 允许您在 WASM 插件中的函数间传递复杂类型。它通过在主机和客机环境之间编码和解码复杂类型来实现这一点。编码和解码由 bincode@2.0.0-rc.2
处理,因此您的类型需要实现 bincode::Encode
和 bincode::Decode
特性。
无头模式
您可以通过禁用默认功能来启用无头模式。这应该会减少主机二进制文件的大小。在无头模式下,您无法编译 wasm 字节码,需要依赖序列化的插件。请参阅 WasmPluginBuilder::from_serialized
、WasmPluginBuilder::from_serialized_compressed
、WasmPlugin::serialize
、WasmPlugin::serialize_compress
。带有 *_compress
、*_compressed
的函数使用 flate2
crate 来压缩/解压缩插件,要使用它们,您需要启用 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>()
}
更完整的示例可以在这里找到
计划中的功能
- 使用 proc macros 改进代码生成。
- 可变引用。
- WASI 支持。
依赖
~1.5MB
~41K SLoC