Rust WebAssembly 绑定输入类型(基于 Serde)
前言
单位有个项目要共享前后端检查策略后端用的正好也是 Rust,但是 Rust 默认的 wasm-bindgen 包中提供的转换操作非常少,像 Vec<T> <=> Array<T> 或者 Box<dyn T> <=> T 的转换就不行了。但是可以从 Typescript 构建这些类型,然后通过序列化的好朋友的 serde 把他们转换回 Rust 来问题。
项目结构
Cargo.toml
src
│ algorithms.rs 共享的算法
│ lib.rs
│ models.rs 共享的数据结构
└─wasm
mod.rs
model_bridge.rs 共享数据结构与自定接口的转换
typescript_custom_types.rs Typescript 中的自定接口
utils.rs
Cargo.toml 中添加新依赖
[dependencies]
# serde 是各种项目必备的,这个是 Rust 各种序列化的基础
serde = { version = "1.0", features = ["derive"] }
# Wasm 绑定工具,需要 Serde 转换特性
wasm-bindgen = { version = "0.2", features = ["serde-serialize"] }
在 typescript_custom_types.rs 中编写自定义的数据结构
use wasm_bindgen::prelude::*;
#[wasm_bindgen(typescript_custom_section)]
pub const IMODEL_TSTEXT: &'static str = r#"
interface IModel {
id: string,
name: string,
}
"#;
编写模型结构体和算法
//! models.rs
use serde::*;
/// 模型类
/// 这里一定要用 `Serialize`, `Deserialize` 转换类型的关键
/// 用 camelCase 则是让 Typescript 和 rust 的命名系统相互转换
#[derive(Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Model {
pub id: String,
pub name: String,
}
算法没有什么好讲的,写很日常的一个方法就可以
model_bridge.rs 编写转换或者绑定方法
use crate::models::*;
use wasm_bindgen::prelude::*;
#[wasm_bindgen]
extern "C" {
/// 绑定 Typescript 中刚才定义的 IModel
#[wasm_bindgen(typescript_type = "IModel")]
pub type IModel;
}
/// 转换
impl From<IModel> for Model {
fn from(f: IModel) -> Model {
model.into_serde().unwrap()
}
}
/// 入口
/// `js_name` 是方法在 Typescript 里显示的名称
#[wasm_bindgen(js_name = "testModel")]
pub fn test_model(model: IModel) -> bool {
let m: Model = model.into_serde().unwrap();
crate::algorithms::test_model(m)
}
检查生成的文件
/*
* 手动定义的接口
*/
interface IModel {
id: string,
name: string,
}
/*
* 自动生成的绑定
*/
export function testModel(model: IModel): boolean;
参考
- Express "Duck-Typed Interface" as trait
- How do you use a Rust struct with a
Stringfield? - Add typescript_type attribute
Rust WebAssembly 绑定输入类型(基于 Serde)的更多相关文章
- 从一次输入框无法输入的bug,谈如何限制输入框输入类型
bug的产生和修改 上周临近周末休息的时候,一个同事跑过来了,对我说:"阿伦啊,有一个页面出问题了,火狐浏览器所有的input都没法输入了."我一听,是不是你给加了什么属性,让in ...
- HTML 表单元素、 输入类型、Input 属性
<input> 元素 最重要的表单元素是 <input> 元素. <input> 元素根据不同的 type 属性,可以变化为多种形态. 注释:下一章讲解所有 HTM ...
- 【rust】Rust变量绑定(3)
Rust 是一个静态类型语言,这意味着我们需要先确定我们需要的类型. 什么是变量绑定? 将一些值绑定到一个名字上,这样可以在之后使用他们. 如何声明一个绑定? 使用 let 关键字: fn main( ...
- HTML5日期输入类型(date)
在很多页面和web应用中都有输入日期和时间的地方,最典型的是订飞机票,火车票,酒店,批萨等网站. 在HTML5之前,对于这样的页面需求,最常见的方案是用Javascript日期选择组件.这几乎是无可争 ...
- Android限定EditText的输入类型为数字或者英文(包括大小写),EditText,TextView只能输入两位小数
Android限定EditText的输入类型为数字或者英文(包括大小写) // 监听密码输入框的输入内容类型,不可以输入中文 TextWatcher mTextWatcher = new Tex ...
- 限制Input输入类型的常见代码集合
搜集整理常见的限制INPUT输入类型的实现方式: 1.只能输入和粘贴汉字 <input onkeyup="value=value.replace(/[^\u4E00-\u9FA5]/g ...
- EditTest输入类型设置
1,当输入为文字性密码时,输入前有提示效果,输入后有遮蔽效果 android:hint="@string/hint_etPassword" android:inputType=&q ...
- C# 中 datagridview 绑定BindingList类型和更新
C# 中的datagridview是一个非常有用且强大的控件,可以用来绑定数据库.绑定LIST类型的变量等等. 这里我们说一说绑定List类型并实时更新datagridview的情况.实时更新,指的是 ...
- C++ vector 实现二维数组时, 在类的头文件中定义时遇到"应输入类型符"的问题?
见下,当我在类的声明文件中定义二维vector时,提示我应输入类型说明符; 但是相同的格式定义,在类中将二维vector修改为在源文件中定义就可以顺利通过,并顺利执行打印 打印结果如下: 望大神来解惑 ...
- HTML5 总结-表单-输入类型
HTML5 Input 类型 HTML5 新的 Input 类型 HTML5 拥有多个新的表单输入类型.这些新特性提供了更好的输入控制和验证. 本章全面介绍这些新的输入类型: email url nu ...
随机推荐
- memcached使用中踩的一些坑
背景 线上启用memcached(以下简称mc)作为热点缓存组件已经多年,其稳定性和性能都经历住了考验,这里记录一下踩过的几个坑. 大key存储 某年某月某日,观察mysql的读库CPU占比有些异常偏 ...
- Vue Router 源码分析💪
专栏分享:vue2源码专栏,玩具项目专栏,硬核 推荐 欢迎各位 ITer 关注点赞收藏 本篇文章参考版本:vue-router v3.x 最终成果,实现了一个可运行的核心路由工程:柏成/vue-rou ...
- Open LLM 排行榜近况
Open LLM 排行榜是 Hugging Face 设立的一个用于评测开放大语言模型的公开榜单.最近,随着 Falcon 的发布并在 Open LLM 排行榜 上疯狂屠榜,围绕这个榜单在推特上掀起了 ...
- 面由 AI 生|ZegoAvatar 捏脸技术解析
一.AI"卷"进实时互动 2021年,元宇宙概念席卷全球,国内各大厂加速赛道布局,通过元宇宙为不同的应用场景的相关内容生态进行赋能.针对"身份"."沉 ...
- 求任意两个正整数的最大公约数(GCD)。
问题描述 求任意两个正整数的最大公约数(GCD). 问题分析 如果有一个自然数a能被自然数b整除,则称a为b的倍数,b为a的约数.几个自然数公有的约数,叫做这几个自然数的公约数.公约数中最大的一个公约 ...
- 使用官方推荐的库来测react hook组件
最近写单元测试的时候遇见了一些问题,当我使用使用jest测React. useRef, React. useEffect时,总是测不到, 然后我去查阅了一下官方文档,它推荐了使用下面这个库 @tes ...
- 帮老娘导入SF信息
转自自己的QQ空间 2023/1/3 老娘公司要统计Excel 简单说就是把顺丰上面寄的85个快递填到表里去 再把没有寄的从那两张表加起来130多个人里面揪出来单独填表 有些企业的Excel就是个灾难 ...
- 原生poi实现模版导出
背景 我们公司是内网开发,外网jar包我的权限不够,所以easyexcel jar包无法使用,参考了easyexcel的填充思想,写了一个较简单的填充方法,如果直接用easyexcel的话,可以参考这 ...
- 基于LLVM的海量数据排序算法研究。(二维表的排序算法)
当待排序数据内容大于内存容量时,需将待排序内容分块,要进行排序的分块传入内存,未处于排序状态的存入外存,外存的读写时间是内存的百万倍,因此在内外存储器之间传输分块所消耗的 I/O 时间是大数据排序算法 ...
- MariaDB start 报错:mysql-bin.index' not found (Errcode: 2) (Errcode: 13)
问题是修改配置log-bin=/data/mysql/binlog/mysql-bin后出现的. 报错:Errcode: 2 mkdir -p /data/mysql/binlog ## 和正常的DB ...