#wasm-bindgen #wasm #jsvalue #wasm-bindgen-futures

into-jsvalue-derive

为异步wasm_bindgen函数中的枚举返回值实现 derive into-jsvalue

2个不稳定版本

0.2.0 2024年7月8日
0.1.0 2024年6月26日

#330 in 过程宏

Download history 142/week @ 2024-06-22 5/week @ 2024-06-29 111/week @ 2024-07-06 6/week @ 2024-07-13 16/week @ 2024-07-27

每月133次下载

MIT许可证

6KB

into_jsvalue - Rust宏,用于从JsValue派生

此Crate提供了一个衍生宏IntoJsValue,用于Rust,它简化了From<T> for wasm_bindgen::JsValue的实现。此Crate适用于特定用例。 wasm_bindgen仅支持C样式枚举。 tsify允许我们通过serde-wasm-bindgen来解决这个问题,但它仅适用于同步函数。此Crate添加了一个简单的衍生宏,该宏将实现必要的From实现

use serde::{Deserialize, Serialize};
use wasm_bindgen::prelude::*;

use into_jsvalue_derive::IntoJsValue;
use tsify::Tsify;

#[wasm_bindgen]
pub async fn test() -> Test { // this works because of the tsify macro above our enum 
    Test::One(String::new())
}

#[wasm_bindgen]
pub async fn async_test() -> Test { // this does not work. It need From<Test> for JsValue to be implemented
    Test::One(String::new())
}

#[derive(Serialize, Deserialize, Tsify)]
#[wasm_bindgen] // This does not work because wasm_bindgen only supports c-style enums
#[tsify(into_wasm_abi, from_wasm_abi)] // this allows test() to work, but not async test. It does not impl the required trait 
pub enum Test {
    One(String),
    Two(String, String),
}

使用方法

  1. 将此Crate添加到Cargo.toml中的依赖项
[dependencies]
into-jsvalue-derive = "0.1.0"  # Replace with the actual version
# include serde, wasm-bindgen and serde-wasm-bindgen
  1. 在结构定义上使用#[derive(IntoJsValue)]属性:注意,结构必须实现serde::Serialize
#[derive(Serialize, IntoJsValue)]
struct MyStruct {
  field1: i32,
  field2: String,
}

该宏将生成以下代码。

// generated by the macro
impl From<MyStruct> for JsValue{
  fn from(value: MyStruct) -> Self {
    let res = serde_wasm_bindgen::to_value(&value);
    wasm_bindgen::UnwrapThrowExt::expect_throw(
      res,
      format!("failed to convert MyStruct to a JsValue"),
    )
  }
}

重要提示

此Crate需要项目中存在serde、wasm_bindgen和serde_wasm_bindgen Crate。

许可证

本项目采用MIT许可证 - 有关详细信息,请参阅LICENSE文件。

依赖关系

~1-2MB
~35K SLoC