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 ...
随机推荐
- 大数据面试题集锦-Hadoop面试题(四)-YARN
你准备好面试了吗?这里有一些面试中可能会问到的问题以及相对应的答案.如果你需要更多的面试经验和面试题,关注一下"张飞的猪大数据分享"吧,公众号会不定时的分享相关的知识和资料. 目录 ...
- async-await Rust: 200 多行代码实现一个极简 runtime
What I cannot create, I do not understand Rust 中的 runtime 到底是咋回事, 为了彻底搞懂它, 我在尽量不借助第三方 crate 的情况下实现了一 ...
- base64详解
base64详解 前置知识 位与字节 二进制系统中,每个0或1就是一个位(bit,比特),也叫存储单元,位是数据存储的最小单位. 其中8bit就称为一个字节(Byte). 1B=8位 位运算 与运算: ...
- dash构建多页应用
dash 构建多页面应用一种方案 本方案对dash官网多页面案例使用dash_bootstrap_components案例进行优化与测试,效果如下 项目代码结构如下 │ app.py │ ├─asse ...
- 我是如何组织 Go 代码的(目录结构 依赖注入 wire)
背景 对于大多数 Gopher 来说,编写 Go 程序会直接在目录建立 main.go,xxx.go,yyy.go-- 不是说不好,对于小型工程来说,简单反而简洁明了,我也提倡小工程没必要整一些花里胡 ...
- Spring相关API
ApplicationContext的继承体系 applicationContext applicationContext:接口类型,代表应用上下文,可以通过其实例获得Spring容器中的Bean A ...
- 2021-10-08 Core的LaunchSettings文件说明
{ "iisSettings": { //是否以IIS Express启动 "windowsAuthentication": false, //是否启用wind ...
- Python sorted() 函数和sort()函数对比分析
Python sorted() 函数 一.概述 sorted()函数是对所有可迭代的对象进行排序操作. sort与sorted的区别: sort是应用在list上的方法,sorted可以对所有可迭代的 ...
- 王道oj/problem9(数组的输入和输出)
网址:http://oj.lgwenda.com/problem/9 思路:第一次读取数组的个数,由于数组不能动态创建,所以先创建最大值a[100] 第二次读取采用循环读取,直接将数组元素读入 最后再 ...
- FreeRTOS 基于 ARMv8-M 对 MPU 的应用
一.前言 ARMv8-M 支持 MPU,FreeRTOS 也添加了对这些 MPU 的应用代码.这里用来记录 FreeRTOS 对 MPU 应用方式的探究结果. 二.ArmV8-M MPU 介绍 ARM ...