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 日 |
#1222 in 编码
54,499 每月下载量
在 7 个 包(5 个直接)中使用
59KB
1.5K SLoC
Rust XDR 库
此包提供了一组运行时例程来编码和解码基本的 XDR 类型,可以与 xdrgen 自动生成的代码或手写的编解码器一起使用。
此包还实现了 XDR-RPC 记录标记,形式为 XdrRecordReader
和 XdrRecordWriter
IO 过滤器。
用法
使用此库最简单的方法是与 xdrgen 一起使用,xdrgen 接受一个 .x
文件中的规范,并为您生成所有必要的定义。
但是,您可以手动实现您自己的类型的 Pack
和 Unpack
特性
struct MyType {
a: u32,
b: Vec<u8>,
}
impl Pack<W> for MyType
where W: Write
{
fn pack(&self, out: &mut W) -> xdr_codec::Result<usize> {
let mut sz = 0;
sz += try!(self.a.pack(out));
sz += try!(Opaque::borrowed(self.b).pack(out));
Ok(sz)
}
}
impl Unpack<R> for MyType
where R: Read
{
fn unpack(input: &mut In) -> Result<(Self, usize)> {
let mut rsz = 0;
let ret = MyType {
a: { let (v, sz) = try!(Unpack::unpack(input)); rsz += sz; v },
b: { let (v, sz) = try!(Opaque::unpack(input)); rsz += sz; v.into_owned() },
};
Ok((ret, rsz))
}
}
或者,将以下内容放入 src/mytype.x
struct MyType {
unsigned int a;
opaque b<>;
}
然后向 Cargo.toml 添加 build.rs
extern crate xdrgen;
fn main() {
xdrgen::compile("src/mytype.x").expect("xdrgen mytype.x failed");
}
然后将生成的代码包含在您的模块之一中
extern crate xdr_codec;
// ...
include!(concat!(env!("OUT_DIR"), "/mytype_xdr.rs"));
文档
完整的文档在这里:https://docs.rs/xdr-codec/。
0.4.2 版本中的更改
实现 char
/unsigned char
(Rust 中的 i8
/u8
)的标准特性。
还在 .x 文件中将 short
/unsigned short
作为扩展处理。它们仍然以 i32
/u32
的形式在内存中表示。
0.4 版本中的更改
版本0.4添加了bytecodec
功能,该功能实现了字节类型(i8
和u8
)的Pack
和Unpack
。这通常是不可取的,因为当单独使用或在字节数组(opaque
是传输紧凑字节数组的首选方式)中使用时,字节会受到大量填充。然而,一些协议错误地指定使用填充的字节数组,因此为这些协议提供了bytecodec
。
0.2版本中的更改
从0.2版本开始引入了许多破坏性变更
-
u8
不再实现Pack
/Unpack
XDR不支持直接编码单个字节;如果支持,则需要将每个字节填充到4个字节。xdr-codec 0.1实现了
Pack
和Unpack
为u8
主要是为了允许直接使用Vec<u8>
作为XDRopaque<>
。然而,这也允许直接使用u8::pack()
,这使得意外生成没有适当填充的畸形XDR流变得过于容易。在0.2中,
u8
不再实现Pack
和Unpack
。取而代之的是,xdr-codec有一个Opaque<'a>(&'a [u8])
包装器来实现这一点。这允许任何[u8]
切片都可以进行打包和解包。它还提供了一组辅助函数,用于打包和解包灵活和固定大小的opaques、字符串和通用数组。这使得以稳健的方式管理数组变得简单。这也允许xdrgen生成固定大小数组的代码,该代码不是完全展开的解包调用。
(然而,我对函数的激增并不完全满意,所以我正在考虑一种更符合Rust语法的基于特质的做法。这可能是0.3。)
-
XDR记录标记的扩展
我添加了
XdrRecordReaderIter
,它允许遍历记录。以前,流中的所有记录都被扁平化到一个普通的字节流中,这违背了记录的目的。XdrRecordReader
仍然实现Read
,所以它仍然可用,但它还实现了IntoIterator
,因此您可以遍历记录。更多单元测试(见下文)指出了一些考虑不周的角落案例,因此现在记录生成和使用EOR标记更为一致。
-
更多单元测试,包括quickcheck生成的测试
我增加了测试数量,并添加了quickcheck生成的测试,解决了几个角落案例。
许可证
根据您的选择,许可方式为以下之一
- Apache License,版本2.0,(LICENSE-APACHE)
- MIT许可证 (LICENSE-MIT)
。
贡献
除非您明确声明,否则您根据Apache-2.0许可证定义的任何有意提交供作品包含的贡献,将按上述方式双许可,不附加任何其他条款或条件。
依赖项
~2.6–4MB
~75K SLoC