#typescript #serialization-deserialization #generate-typescript #bincode #file

bin+lib bincode-typescript

从 Rust 结构体和枚举生成 TypeScript 序列化和反序列化代码

1 个不稳定版本

0.1.0 2020 年 10 月 23 日

#1918编码

MIT 许可协议

40KB
1K SLoC

Jinja2 566 SLoC Rust 448 SLoC

bincode-typescript

从 Rust 结构体和枚举生成 TypeScript 序列化和反序列化代码

目标

  • 直接从 Rust 源代码生成 TypeScript 代码
  • TypeScript 必须在 strict 模式下编译
  • 避免面向对象的 TypeScript 以获得更好的 tree-shaking 和优化
  • TypeScript 应该易于使用且性能高
    • 对于单元枚举,使用 const enum 并尊重区分值!
    • 对于性能,使用 TypedArray 和复制字节块来处理 Vec<{integer,float}>

状态

我对 Rust 比较新,我只是胡乱修改直到测试通过 🤷‍♂️

还有很多改进的空间,欢迎提交 PR!

请查看 目前支持的 Rust 类型及其 TypeScript 对应类型 的源代码。

您还可以查看测试中使用的 Rust 类型 以及由此生成的 TypeScript

当前问题和限制

  • 所有值都必须是拥有的
  • 泛型结构体/枚举几乎肯定会导致 panic
  • 所有类型必须位于单个文件中
  • 当前不尊重 Serde 属性
  • Vec<{T> 总是在可能的情况下转换为 Uint8Array/Int8Array/,但这可能并不总是所需的。
  • 由于全局使用 TextEncoder/TextDecoder,生成的代码在 node < v11 上将无法工作

通过 build.rs 的示例

目前有一个选项 bool 用于启用对 node.js Buffer 的支持,因此如果您在浏览器中运行,可能不需要启用此选项。

bincode_typescript::from_file("./src/types.rs", "./ts/types.ts", false);

通过 CLI 的示例

目前有一个选项(--buffer-support)可以启用对 node.js Buffer 的支持。

./bincode-typescript --support-buffer ./src/types.rs > ./ts/types.ts

测试

在运行测试之前,请确保您已通过运行 yarnnpm i 安装了所有 node.js 依赖项。

测试检查从生成的 TypeScript 进行序列化和反序列化,通过在 stdio 中往返编码数据并断言预期值。

现有技术

这基于以下项目(即从这些项目中借鉴了大量 TypeScript)。

所述的优缺点仅代表个人观点!

ts-rust-bridge

优点

  • 基于函数的 TypeScript API
  • 对于枚举,结合 type + interface + module 具有出色的易用性

缺点

  • 从 DSL 生成 Rust 和 TypeScript。(我希望 Rust 是真理的来源)
  • 单元枚举不使用 const enum

serde-反射/serde-生成

优点

  • 使用 serde,因此无需解析 Rust

缺点

  • 必须在构建后通过注册表运行所有类型,因此无法从 build.rs 运行
  • TypeScript 类包装每个类型并使用继承(即没有 const enum
  • 运行时 TypeScript 是独立的

依赖项

~3.5MB
~73K SLoC