#wasm-module #generate #cargo

witgen

witgen 是一个库,帮助您在 wit 文件中为 WebAssembly 生成 wit 定义

13 个重大版本

0.15.0 2022 年 7 月 28 日
0.12.0 2022 年 4 月 15 日
0.11.0 2022 年 3 月 10 日
0.5.0 2021 年 12 月 23 日

405WebAssembly 中排名

Download history 193/week @ 2024-03-13 280/week @ 2024-03-20 355/week @ 2024-03-27 405/week @ 2024-04-03 445/week @ 2024-04-10 189/week @ 2024-04-17 307/week @ 2024-04-24 290/week @ 2024-05-01 231/week @ 2024-05-08 244/week @ 2024-05-15 163/week @ 2024-05-22 404/week @ 2024-05-29 249/week @ 2024-06-05 182/week @ 2024-06-12 391/week @ 2024-06-19 216/week @ 2024-06-26

1,070 每月下载量
用于 6 个 crate(直接使用 2 个)

自定义许可证

38KB
727

witgen

Rust Rust Version Docs.rs

witgen 是一个库和 CLI 工具,帮助您为 WebAssembly 生成 wit 定义。结合使用此库和 wit-bindgen,可以帮助您从/到 wasm 模块导入/导出类型和函数。此项目目前支持 wit 解析器版本 0.2.0,请见 此处

入门指南

目标: 仅使用 Rust 编写代码生成 .wit 文件。

您需要库和 CLI。

预备知识

  • 创建一个新的库项目并移动到该项目。
$ cargo new my_wit
$ cd my_wit
  • 在您的 Cargo.toml 中添加 witgen 作为依赖项。注意:必须安装 cargo-edit 以从 CLI 添加依赖项,例如 cargo install cargo-edit
$ cargo add witgen
  • 安装 cargo witgen CLI。
$ cargo install cargo-witgen

编写代码

  • 将您的 lib.rs 中的内容替换为
use witgen::witgen;

#[witgen]
use other_crate::*;

/// Doc strings are supported!
#[witgen]
struct TestStruct {
    /// Even for fields!
    inner: String,
}

#[witgen]
enum TestEnum {
    Unit,
    Number(u64),
    StringVariant(String),
}

#[witgen]
fn test(other: Vec<u8>, test_struct: TestStruct, other_enum: TestEnum) -> Result<(String, i64), String> {
    // The following code is not part of the generated `.wit` file.
    // You may add an example implementation or just satisfy the compiler with a `todo!()`.
    Ok((String::from("test"), 0i64))
}

#[witgen]
impl AResource {
  /// Can convert custom attributes to doc strings
  #[custom_attribute]
  pub fn foo(&self) {}
  /// Have special mutable attribute
  pub fn faa(&mut self) {}

  pub fn fee() {}
}
  • 然后您可以在您的包根目录下启动 CLI
cargo witgen generate
  • 它将在您的包根目录下生成一个 index.wit 文件

use * from other-crate

/// Doc strings are supported!
record test-struct {
  /// Even for fields!
  inner: string
}

variant test-enum {
  unit,
  number(u64),
  string-variant(string),
}

test : func(other: list <u8>, test-struct: test-struct, other-enum: test-enum) -> expected<tuple<string, s64>>

resource a-resource {
  /// Can convert custom attributes to doc strings
  /// @custom_attribute
  foo: func()
  /// Have special mutable attribute
  /// @mutable
  faa: func()
  static fee: func()
}
  • 您可以在 此处 找到更完整的示例

限制

目前使用 #[witgen] 有一些限制

  • 您只能使用进程宏 #[witgen]structenumtype aliasfunctionimpluse
  • 不支持泛型参数或生命周期注解,除了 HashMap,它被解释为 list<tuple<key, value>>
  • 类型 &str 不支持(但您可以使用 String
  • 引用、BoxRcArc 以及所有智能指针类型均不支持
  • 没有语义分析,这意味着如果您的 functionstructenum 使用了非标量类型,您必须在此类型声明处添加 #[witgen](它不会在编译时失败)

开发

这是一个非常基础的版本,它目前不支持所有类型的类型,但主要类型都是支持的。我制作它的目的是为了方便生成针对我需求的 .wit 文件。如果您需要什么,请随时创建问题或拉取请求。我将很高兴帮助您!

依赖项

约 5MB
约 138K SLoC