#binary-format #serialization #postcard #javascript #generate #serde

不依赖 std postcard-bindgen-core

一个用于为除 Rust 之外的语言生成 postcard 二进制格式的绑定的 crate - 核心crate

11 个版本

0.3.3 2024 年 2 月 4 日
0.3.2 2023 年 8 月 20 日
0.3.0 2023 年 4 月 30 日
0.2.0 2023 年 1 月 19 日
0.1.2 2022 年 11 月 26 日

#2098编码


2 crate 使用

MIT/Apache

87KB
2K SLoC

Postcard Bindgen

Build status License Crates.io Documentation

Postcard Bindgen 允许为其他语言生成代码,以便将数据序列化到 postcard 字节格式并从中反序列化。这有助于设置使用 postcard crate 和其轻量级内存格式的微控制器与应用程序之间的通信。

可以通过使用 PostcardBindings 注解主类型(结构体和枚举)来生成它们的代码。生成的代码可以导出为 npm 包,以便将其导入到 JavaScript 项目中。

使用方法

⚠️ 使用 rust nightly 运行生成绑定的 crate。这是必要的,因为此 crate 依赖于 genco,并且此 crate 使用 nightly 特性来检测列的变化。

需要生成绑定的结构体和枚举必须使用 serde crate 中的 Serialize/Deserialize 以及此 crate 中的 PostcardBindings 宏进行注解。

此过程分为两个步骤。首先,是注解步骤。这主要在库 crate 中完成。其次,在额外的二进制 crate 中导入注解过的结构体和枚举(这意味着库 crate 必须被定义为依赖项),并添加生成逻辑作为主函数。要生成 npm 包,必须运行此额外的二进制 crate。

如果将 postcard-bindgen crate 添加为生成二进制 crate 的依赖项,则必须启用未来的 generating

示例

此示例演示了如何轻松生成 npm 包。为此,结构体 Test 和生成逻辑位于同一 rust 文件中。

#[derive(Serialize, PostcardBindings)]
struct Test {
    name: u8,
    other: u16,
}

fn main() {
    build_npm_package(
        std::env::current_dir().unwrap().as_path(),
        PackageInfo {
            name: "generation-test".into(),
            version: "0.1.0".try_into().unwrap(),
        },
        generate_bindings!(Test),
    )
    .unwrap();
}

以下代码现在可以用于在 JavaScript 中序列化对象。

import { serialize } from "generation-test";

const test = {
    name: "test",
    other: 23
}

const bytes = serialize("Test", test)

JavaScript 类型映射

类型名称 Rust Js
单元类型
struct UnitStruct;
{}
新类型
struct NewType(u8);
[123]
元组结构体
struct TupleStruct(u8, u16, u32);
[123, 1234, 12345]
结构体
struct Struct {
    a: u8,
    b: u16
};
{
    a: 123,
    b: 1234
}
枚举
enum Enum {
    A,
    B(u8),
    C {
        a: u8
    }
};
{
    tag: "A",
},
{
    tag: "B",
    value: 123
},
{
    tag: "C",
    value: {
        a: 123
    }
}
Option
struct OptionTuple(Option<u8>);

struct OptionStruct {
    a: Option<u8>
}
// OptionTuple(Some(123))
[123]
// OptionTuple(None)
[undefined]

// OptionStruct { a: Some(123) }
{
    a: 123
}
// OptionStruct { a: None }
{}
// or
{
    a: undefined
}
Map
let map_string_key = HashMap::<String, u8>::new();

let map_any_key = HashMap::<u16, u8>::new();
// map_string_key
{
    key: value
}

// map_any_key
new Map()

许可协议

根据您的选择,许可协议可以是Apache License,版本2.0或MIT许可。

除非您明确说明,否则您提交给Postcard Bindgen以供包含在内的任何贡献,如Apache-2.0许可中定义,应以上述双重许可方式许可,不附加任何额外条款或条件

依赖项

~0–405KB