2个不稳定版本
0.2.0 | 2024年7月8日 |
---|---|
0.1.0 | 2024年6月26日 |
#330 in 过程宏
每月133次下载
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),
}
使用方法
- 将此Crate添加到Cargo.toml中的依赖项
[dependencies]
into-jsvalue-derive = "0.1.0" # Replace with the actual version
# include serde, wasm-bindgen and serde-wasm-bindgen
- 在结构定义上使用
#[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