1 个不稳定版本
0.1.0 | 2023年1月26日 |
---|
#37 in #wasm-plugin
用于 scotch-host
16KB
365 代码行
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>()
}
更多完整的示例可以在这里找到
计划的功能
- 改进过程宏的代码生成。
- 可变引用。
- WASI支持。
依赖项
~1.5MB
~35K SLoC