23 个版本
使用旧的 Rust 2015
0.4.4 | 2017年8月2日 |
---|---|
0.4.3 | 2017年7月18日 |
0.4.2 | 2017年6月20日 |
0.4.0 | 2017年3月3日 |
0.1.7 | 2015年11月11日 |
#2087 在 解析实现
51,805 每月下载量
在 2 crates 中使用
135KB
3K SLoC
Rust XDR 库
此包提供了 xdrgen,它从 .x 文件中读取 XDR 规范,并生成用于序列化和反序列化指定类型的 Rust 代码。它旨在与 xdr-codec 一起使用。
.x 文件的语法遵循 RFC4506。它包含 XDR 的类型定义,但不包括 RPC 协议规范。相应地,xdrgen 不支持自动生成 RPC 客户端/服务器。
0.4.0 版本的变化
- 现在使用
quote
包,因此它可以在稳定 Rust 上运行 - 检测 XDR 规范中 Rust 关键字的使用,并在它们后面附加一个
_
。
用法
用法很简单。您可以从构建.rs 中的规范生成 Rust 代码
extern crate xdrgen;
fn main() {
xdrgen::compile("src/simple.x").expect("xdrgen simple.x failed");
}
然后可以将此代码包含到模块中
mod simple {
use xdr_codec;
#[allow(dead_code)]
include!(concat!(env!("OUT_DIR"), "/simple_xdr.rs"));
}
一旦您有了这个,您就可以调用 mytype.pack(&mut output)
,以及 let mything: MyThing = xdr_codec::unpack(&mut input)?;
。
序列化器要求您的类型实现 Pack
和 Unpack
特性,并生成写入到 std::io::Write
实现的代码,并从 std::io::Read
中读取。
所有类型和字段都生成为公共的,因此您可以在模块或crate外部控制它们的访问。如果您的规范引用了在规范内部未定义的其他类型,则可以在模块内部定义它们,无论是通过将它们与定义的类型进行别名,还是通过自己实现Pack
和Unpack
特质。
可以使用xdr-codec的XdrRecordReader
和XdrRecordWriter
类型作为实现XDR-RPC记录标记的IO过滤器。
有关xdrgen的更多文档。有关使用生成的类型和代码的更多详细信息,请参阅xdr-codec文档。
限制
目前有一些限制
- 生成的代码使用.x文件中指定的标识符,因此Rust代码将不会使用常规格式化约定。
- 生成的代码不遵循任何格式化约定 - 如有必要,请使用rustfmt。
- XDR具有有区分的联合体,它们非常适合Rust枚举。然而,如果遇到未知的区分器,它还支持一个
default
情况。这个crate支持解包,但不支持打包,因为Rust不允许枚举有未知值。 - 生成的代码使用
#[derive(Debug, Clone, ...)]
来生成常见特质的实现。然而,rustc仅支持固定大小为0..32的数组上的#[derive]
;如果您有一个大于此的数组,生成的代码将无法编译。目前,唯一的解决方案是手动为这些类型实现Pack
和Unpack
。 (待办事项:添加一个选项以省略派生特质。)
许可证
根据您的要求,许可为以下之一
- Apache License,版本2.0,(LICENSE-APACHE)
- MIT许可证(LICENSE-MIT)
任选。
贡献
除非您明确声明,否则任何有意提交以包含在您的工作中的贡献,根据Apache-2.0许可证定义,均应如上双许可,不附加任何额外条款或条件。
依赖项
~8.5MB
~168K SLoC