#bare #serialization #schema-file #proc-macro #message-format #data #type

bare_proc

一个用于从BARE模式文件生成Rust类型的进程宏

4个版本

0.2.0 2024年4月22日
0.1.2 2024年4月21日
0.1.1 2024年4月21日
0.1.0 2024年4月21日

#447 in 过程宏

每月 38 次下载

MIT 许可证

26KB
523

bare_proc

bare_proc 是一个进程宏,实现了对 BARE消息格式 的解析生成器。

它依赖于 serde,使用 serde_bare 实现序列化。

用法

在.bare文件中定义您的BARE模式

type User struct {
  name: str
  key: data[128]
  id: uint
}

然后在相应的Rust文件中

bare_schema!("schema.bare");

它大致会扩展成以下内容

#[derive(Serialize, Deserialize, PartialEq, Eq, Debug)]
struct User {
    name: String,
    key: Vec<u8>,
    id: u64,
}

许可证

bare_proc 使用MIT许可证。


lib.rs:

bare_proc 提供了一个简单的进程宏,可以从BARE模式文件生成Rust类型。生成的类型隐式实现了 serde::Serializeserde::Deserialize,因为使用了 serde_bare 来处理编码和解码。请参阅 serde_bare的文档 了解Rust数据模型如何映射到BARE数据模型。

要使用此宏,请定义一个BARE模式文件并填充类型声明。

例如

// schema.bare
type PublicKey data[128]
type Time str # ISO 8601

type Department enum {
ACCOUNTING
ADMINISTRATION
CUSTOMER_SERVICE
DEVELOPMENT

JSMITH = 99
}

type Address list<str>[4] # street, city, state, country

type Customer struct {
name: str
email: str
address: Address
orders: list<struct {
orderId: i64
quantity: i32
}>
metadata: map<str><data>
}

type Employee struct {
name: str
email: str
address: Address
department: Department
hireDate: Time
publicKey: optional<PublicKey>
metadata: map<str><data>
}

type TerminatedEmployee void

type Person union {Customer | Employee | TerminatedEmployee}

然后在Rust源文件中

use bare_proc::bare_schema;

bare_proc!("schema.bare");


let noah = Employee {
name: "Noah",
email: "[email protected]",
address: ["", "", "", ""],
department: Department::ACCOUNTING,
hireDate: Vec::<u8>::new(),
publicKey: None,
metadata: HashMap::new(),
};

BARE -> Rust数据映射

在大多数情况下,BARE数据模型可以干净地映射到Rust表示。除非另有说明,否则从给定的BARE类型生成的最明显的Rust数据类型。例如,BARE option<type> 映射到Rust的 Option<type>,BARE联合和枚举映射到Rust enum。以下是对此crate中不干净映射或需要额外解释的数据类型的一些观点。

映射

BARE映射在Rust中解释为 HashMap<K, V>。目前这不可配置,但未来可能会。

可变长度整数

变量 uintint 类型分别映射到 serde_bare::UIntserde_bare::Int。这些类型封装了 u64i64(BARE 可变长度整数中存储的最大可能值的类型)。

具有32个或更少元素的数组直接映射为Rust数组,而具有超过32个元素的BARE数组则转换为 Vec<T>

依赖项

~2.2–3MB
~62K SLoC