1 个不稳定版本

0.1.0 2023年1月26日

#38 in #wasm-plugin


用于 scotch-guest

MIT 许可证

9KB
201

Scotch

使用Rust创建WASM插件的库。Scotch允许你在WASM插件中传递复杂类型。它通过在宿主和客户环境之间编码和解码复杂类型来实现这一点。编码和解码由bincode处理,因此你需要你的类型实现bincode::Encodebincode::Decode特性。

无头模式

你可以禁用默认功能以启用无头模式。这应该会减小宿主二进制文件的大小。在无头模式下,你无法编译WASM字节码,需要依赖序列化的插件。请参阅WasmPluginBuilder::from_serializedWasmPluginBuilder::from_serialized_compressedWasmPlugin::serializeWasmPlugin::serialize_compress*_compress*_compressed函数使用flate2包来压缩/解压缩插件,要使用它们,你需要启用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