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

无 std postcard-bindgen-derive

为除 Rust 之外的其他语言生成 postcard 二进制格式的绑定 - Derive 包

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日

#5 in #postcard

Download history 1/week @ 2024-03-09 7/week @ 2024-03-30 4/week @ 2024-05-18 1/week @ 2024-05-25

每月 57 次下载
用于 postcard-bindgen

MIT/Apache

100KB
2K SLoC

Postcard Bindgen

Build status License Crates.io Documentation

Postcard Bindgen 允许为其他语言生成代码,以将对象序列化和反序列化为 postcard 字节格式。这有助于设置例如微控制器和 App 之间的通信,使用 postcard crate 和其轻量级内存格式。

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

用法

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

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

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

如果将 postcard-bindgen 包添加为生成二进制包的依赖项,则必须启用未来的 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
    }
}
选项
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
}
映射
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,Version 2.0或MIT许可的约束。

除非您明确表示,否则您故意提交给Postcard Bindgen以包含在内的任何贡献,根据Apache-2.0许可定义,应按上述方式双重许可,不附加任何额外的条款或条件。

依赖关系

~3.5–5.5MB
~96K SLoC