5 个版本 (有破坏性)
0.5.0 | 2022 年 5 月 10 日 |
---|---|
0.4.0 | 2020 年 9 月 14 日 |
0.3.0 | 2020 年 7 月 23 日 |
0.2.0 | 2020 年 6 月 1 日 |
0.1.0 | 2020 年 5 月 29 日 |
#561 in 编码
每月下载量 3,272
用于 ostree-ext
135KB
2K SLoC
GVariant-rs
专为快速读取内存缓冲区而设计的 GVariant 序列化格式的纯 Rust 实现。
let string = gv!("s").from_bytes("It works!\0");
assert_eq!(string, "It works!");
文档
使用方法
将以下内容添加到您的 Cargo.toml
[dependencies]
gvariant = "0.5"
示例:读取 ostree dirtree 文件并打印列表
use gvariant::{gv, Marker, Structure};
use std::error::Error;
fn ostree_ls(filename: &std::path::Path) -> Result<(), Box<dyn Error>> {
// Read the data into the buffer and interpret as an OSTree tree:
let tree = gv!("(a(say)a(sayay))").deserialize(std::fs::File::open(filename)?)?;
// (a(say)a(sayay)) is a structure, so tree implements gvariant::Structure,
// and we can turn it into a tuple:
let (files, dirs) = tree.to_tuple();
// Print the contents
for s in dirs {
let (filename, tree_checksum, meta_checksum) = s.to_tuple();
println!(
"{} {} {}/",
hex::encode(tree_checksum),
hex::encode(meta_checksum),
filename
)
}
for f in files {
let (filename, checksum) = f.to_tuple();
println!("{} {}", hex::encode(checksum), filename)
}
Ok(())
}
状态
- 已实现所有 GVariant 类型的支持
- 对于 "正常形式" 中的所有数据,行为与 GLib 的实现相同。这已在模糊测试中得到证实。对于非正常形式的数据有一些差异。更多信息请见 https://gitlab.gnome.org/GNOME/glib/-/issues/2121
TODO
- 发布 1.0 版本
- 基准测试和性能改进
- 确保非正常结构的反序列化与 GLib 在所有情况下匹配。
编程
使用以下方式构建
cargo build
运行测试
cargo test
Clippy 检查
cargo clippy
模糊测试
RUSTFLAGS='-C overflow-checks=on' ASAN_OPTIONS="detect_leaks=0" cargo +nightly fuzz run --release fuzz_target_1
许可证
本项目受以下任一许可证的许可
- Apache License, Version 2.0, (LICENSE-APACHE 或 http://www.apache.org/licenses/LICENSE-2.0)
- MIT 许可证 (LICENSE-MIT 或 http://opensource.org/licenses/MIT)
根据您的选择。
依赖项
~2MB
~41K SLoC