4 个版本 (2 个重大更新)
0.4.0 | 2022年3月26日 |
---|---|
0.2.1 | 2021年12月28日 |
0.2.0 | 2021年2月8日 |
0.1.0 | 2020年12月22日 |
#1786 在 编码
每月 30 次下载
在 2 crate 中使用
41KB
807 行
Rust 对消息数据交换格式的绑定
这是消息二进制数据交换格式的纯 Rust 实现。
最低支持的 Rust 版本
由于这个 crate 使用 fallible collection API 在反序列化值时预分配集合,因此最低要求的 Rust 版本是 1.57.0
。
使用方法
将此添加到您的 Cargo.toml 文件中
[dependencies]
nachricht = "0.4.0"
然后您可以构建、编码和解码消息
use std::borrow::Cow;
use std::collections::BTreeMap;
use nachricht::*;
fn main() -> Result<(), Box<dyn Error>> {
let mut buf = Vec::new();
let nachricht = Value::Record(BTreeMap::from([(Cow::Borrowed("key"), Value::Str(Cow::Borrowed("value")))]));
Encoder::encode(&nachricht, &mut buf)?;
let decoded = Decoder::decode(&buf)?.0;
assert_eq!(nachricht, decoded);
Ok(())
}
lib.rs
:
所有编码函数都接受 &self
和一个写入器,并返回写入的字节数。所有解码函数都接受一个缓冲区,并返回 Self
和消耗的字节数。
关于 usize
的说明
消息
在内部使用 64 位无符号整数来表示字段长度。然而,Rust 使用架构相关的 usize
用于切片索引。这意味着在 usize
小于 u64
的架构上(例如 32 位 i386),一些有效的 消息
消息无法解码,因为没有有效的方法来高效索引容器。在这种情况下将引发一个 DecodeError::Length
。同样,在 usize
大于 u64
的架构上,一些有效的 Rust 数据结构无法编码,因为没有方法在线路格式中表示它们。在这种情况下将引发一个 EncodeError::Length
。
关于 Map 的说明
这个变体 Value::Map
在内部使用了一个键值对数组 Vec
,因为 Rust 的浮点数类型 f32
和 f64
既没有实现 Ord
也没有实现 Hash
,因此 Value
不能用作标准库映射中的键。
同样地,Value::Record
使用的是 BTreeMap
而不是 HashMap
,因为当确定具有相同布局的记录是否已经被编码以便可以重用时,字段名需要有一个稳定的顺序。
示例
use nachricht::*;
use std::borrow::Cow;
use std::collections::BTreeMap;
let mut buf = Vec::new();
let value = Value::Record(BTreeMap::from([(Cow::Borrowed("key"), Value::Str(Cow::Borrowed("value")))]));
Encoder::encode(&value, &mut buf);
assert_eq!(buf, [
0xa1, // Record of length 1
0x63, // Symbol of length 3
0x6b, // 'k'
0x65, // 'e'
0x79, // 'y'
0x45, // Str of length 5
0x76, // 'v'
0x61, // 'a'
0x6c, // 'l'
0x75, // 'u',
0x65, // 'e'
]);
let decoded = Decoder::decode(&buf).unwrap();
assert_eq!(value, decoded.0);
assert_eq!(11, decoded.1);