33个版本 (稳定版)

4.3.6 2024年8月22日
4.3.5 2024年7月16日
4.3.2 2024年6月11日
4.2.7 2024年3月19日
0.1.0 2021年4月1日

#1484WebAssembly

Download history 19/week @ 2024-04-29 246/week @ 2024-05-06 62/week @ 2024-05-13 155/week @ 2024-05-20 16/week @ 2024-05-27 8/week @ 2024-06-03 135/week @ 2024-06-10 36/week @ 2024-06-17 13/week @ 2024-06-24 153/week @ 2024-07-01 185/week @ 2024-07-08 149/week @ 2024-07-15 20/week @ 2024-07-22 76/week @ 2024-07-29 5/week @ 2024-08-05 9/week @ 2024-08-12

每月112 次下载
用于 6 个crate(直接使用2个)

MIT 许可证

56KB
1K SLoC

Wasm接口

这是一个用于验证WebAssembly模块导入和导出的实验性crate。

目前,Wasm Interface提供

  • 一种方便的文本格式,用于指定Wasm模块的要求
  • 一种方便的方式来安全地组合接口(它确保没有冲突(允许重复,但它们必须一致))
  • 验证模块是否符合要求

语法示例

以下是WASI当前版本的接口

(interface "wasi_unstable"
  ;; Here's a bunch of function imports!
  (func (import "wasi_unstable" "args_get") (param i32 i32) (result i32))
  (func (import "wasi_unstable" "args_sizes_get") (param i32 i32) (result i32))
  (func (import "wasi_unstable" "clock_res_get") (param i32 i32) (result i32))
  (func (import "wasi_unstable" "clock_time_get") (param i32 i32 i32) (result i32))
  (func (import "wasi_unstable" "environ_get") (param i32 i32) (result i32))
  (func (import "wasi_unstable" "environ_sizes_get") (param i32 i32) (result i32))
  (func (import "wasi_unstable" "fd_advise") (param i32 i64 i64 i32) (result i32))
  (func (import "wasi_unstable" "fd_allocate") (param i32 i64 i64) (result i32))
  (func (import "wasi_unstable" "fd_close") (param i32) (result i32))
  (func (import "wasi_unstable" "fd_datasync") (param i32) (result i32))
  (func (import "wasi_unstable" "fd_fdstat_get") (param i32 i32) (result i32))
  (func (import "wasi_unstable" "fd_fdstat_set_flags") (param i32 i32) (result i32))
  (func (import "wasi_unstable" "fd_fdstat_set_rights") (param i32 i64 i64) (result i32))
  (func (import "wasi_unstable" "fd_filestat_get") (param i32 i32) (result i32))
  (func (import "wasi_unstable" "fd_filestat_set_size") (param i32 i64) (result i32))
  (func (import "wasi_unstable" "fd_filestat_set_times") (param i32 i64 i64 i32) (result i32))
  (func (import "wasi_unstable" "fd_pread") (param i32 i32 i32 i64 i32) (result i32))
  (func (import "wasi_unstable" "fd_prestat_get") (param i32 i32) (result i32))
  (func (import "wasi_unstable" "fd_prestat_dir_name") (param i32 i32 i32) (result i32))
  (func (import "wasi_unstable" "fd_pwrite") (param i32 i32 i32 i64 i32) (result i32))
  (func (import "wasi_unstable" "fd_read") (param i32 i32 i32 i32) (result i32))
  (func (import "wasi_unstable" "fd_readdir") (param i32 i32 i32 i64 i32) (result i32))
  (func (import "wasi_unstable" "fd_renumber") (param i32 i32) (result i32))
  (func (import "wasi_unstable" "fd_seek") (param i32 i64 i32 i32) (result i32))
  (func (import "wasi_unstable" "fd_sync") (param i32) (result i32))
  (func (import "wasi_unstable" "fd_tell") (param i32 i32) (result i32))
  (func (import "wasi_unstable" "fd_write") (param i32 i32 i32 i32) (result i32))
  (func (import "wasi_unstable" "path_create_directory") (param i32 i32 i32) (result i32))
  (func (import "wasi_unstable" "path_filestat_get") (param i32 i32 i32 i32 i32) (result i32))
  (func (import "wasi_unstable" "path_filestat_set_times") (param i32 i32 i32 i32 i64 i64 i32) (result i32))
  (func (import "wasi_unstable" "path_link") (param i32 i32 i32 i32 i32 i32 i32) (result i32))
  (func (import "wasi_unstable" "path_open") (param i32 i32 i32 i32 i32 i64 i64 i32 i32) (result i32))
  (func (import "wasi_unstable" "path_readlink") (param i32 i32 i32 i32 i32 i32) (result i32))
  (func (import "wasi_unstable" "path_remove_directory") (param i32 i32 i32) (result i32))
  (func (import "wasi_unstable" "path_rename") (param i32 i32 i32 i32 i32 i32) (result i32))
  (func (import "wasi_unstable" "path_symlink") (param i32 i32 i32 i32 i32) (result i32))
  (func (import "wasi_unstable" "path_unlink_file") (param i32 i32 i32) (result i32))
  (func (import "wasi_unstable" "poll_oneoff") (param i32 i32 i32 i32) (result i32))
  (func (import "wasi_unstable" "proc_exit") (param i32))
  (func (import "wasi_unstable" "proc_raise") (param i32) (result i32))
  (func (import "wasi_unstable" "random_get") (param i32 i32) (result i32))
  (func (import "wasi_unstable" "sched_yield") (result i32))
  (func (import "wasi_unstable" "sock_recv") (param i32 i32 i32 i32 i32 i32) (result i32))
  (func (import "wasi_unstable" "sock_send") (param i32 i32 i32 i32 i32) (result i32))
  (func (import "wasi_unstable" "sock_shutdown") (param i32 i32) (result i32))
)

注意

  • 允许存在多个assert-importassert-export声明。
  • 注释(以;开头并结束于换行符)和空白字符在任意标记之间都是有效的

语义

模块使用的所有导入必须在接口中指定。

接口中的所有导出必须由模块导出。

因此,模块可能比接口有更多的导出或比接口指定的导入更少,但仍被视为有效。

其他

Wasm Interface的目的与提议的Wasm标准WebIDL略有不同,但在将来如果情况发生变化,可能会被它取代。

由于Rust中嵌套闭包的问题,wasm-interface无法同时在稳定版编译并且有良好的错误报告。这个问题正在修复,wasm-interface将更新以拥有更好的错误处理。

请参阅parser.rs文件中的注释,其中包含BNF风格的语法。

欢迎提出建议、贡献和思考!这是一个处于早期阶段的实验,但我们希望与更广泛的社区合作,并与所有感兴趣的一方合作开发。

依赖项

~1.2–2.4MB
~50K SLoC