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 次下载
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::Serialize
和 serde::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>
。目前这不可配置,但未来可能会。
可变长度整数
变量 uint
和 int
类型分别映射到 serde_bare::UInt
和 serde_bare::Int
。这些类型封装了 u64
和 i64
(BARE 可变长度整数中存储的最大可能值的类型)。
具有32个或更少元素的数组直接映射为Rust数组,而具有超过32个元素的BARE数组则转换为 Vec<T>
。
依赖项
~2.2–3MB
~62K SLoC