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

no-std postcard-bindgen

一个用于为除Rust以外的其他语言生成postcard二进制格式的绑定的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日

#956 in 编码

每月 45次下载

MIT/Apache

110KB
2.5K SLoC

Postcard Bindgen

Build status License Crates.io Documentation

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

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

使用方法

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

需要生成绑定的结构体和枚举必须使用来自serde crateSerialize/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许可证第2版或MIT许可证的许可。

除非您明确声明,否则根据Apache-2.0许可证定义,您有意提交以包含在Postcard Bindgen中的任何贡献,应如上双许可,没有任何附加条款或条件。

依赖项

~3.5–5.5MB
~98K SLoC