#xdr #serialization #protocols #encoding #rfc4506

bin+lib xdrgen

从规范生成 XDR 编码器。适用于与 xdr-codec 一起使用。

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解析实现

Download history 1736/week @ 2024-04-08 25968/week @ 2024-04-15 26249/week @ 2024-04-22 10447/week @ 2024-04-29 12037/week @ 2024-05-06 13585/week @ 2024-05-13 20617/week @ 2024-05-20 13869/week @ 2024-05-27 13116/week @ 2024-06-03 12828/week @ 2024-06-10 14114/week @ 2024-06-17 14866/week @ 2024-06-24 11666/week @ 2024-07-01 14033/week @ 2024-07-08 12968/week @ 2024-07-15 12168/week @ 2024-07-22

51,805 每月下载量
2 crates 中使用

MIT/Apache

135KB
3K SLoC

Rust XDR 库

Build Status Crates.io Coverage Status

此包提供了 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)?;

序列化器要求您的类型实现 PackUnpack 特性,并生成写入到 std::io::Write 实现的代码,并从 std::io::Read 中读取。

所有类型和字段都生成为公共的,因此您可以在模块或crate外部控制它们的访问。如果您的规范引用了在规范内部未定义的其他类型,则可以在模块内部定义它们,无论是通过将它们与定义的类型进行别名,还是通过自己实现PackUnpack特质。

可以使用xdr-codec的XdrRecordReaderXdrRecordWriter类型作为实现XDR-RPC记录标记的IO过滤器。

有关xdrgen的更多文档。有关使用生成的类型和代码的更多详细信息,请参阅xdr-codec文档

限制

目前有一些限制

  • 生成的代码使用.x文件中指定的标识符,因此Rust代码将不会使用常规格式化约定。
  • 生成的代码不遵循任何格式化约定 - 如有必要,请使用rustfmt。
  • XDR具有有区分的联合体,它们非常适合Rust枚举。然而,如果遇到未知的区分器,它还支持一个default情况。这个crate支持解包,但不支持打包,因为Rust不允许枚举有未知值。
  • 生成的代码使用#[derive(Debug, Clone, ...)]来生成常见特质的实现。然而,rustc仅支持固定大小为0..32的数组上的#[derive];如果您有一个大于此的数组,生成的代码将无法编译。目前,唯一的解决方案是手动为这些类型实现PackUnpack。 (待办事项:添加一个选项以省略派生特质。)

许可证

根据您的要求,许可为以下之一

任选。

贡献

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

依赖项

~8.5MB
~168K SLoC