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日 |
#120 在 #proc
每月下载量 2,344
在 2 个库中使用(通过 gvariant)
30KB
721 行
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。
待办事项
- 发布版本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许可证2.0版(LICENSE-APACHE 或 http://www.apache.org/licenses/LICENSE-2.0)
- MIT许可证(LICENSE-MIT 或 http://opensource.org/licenses/MIT)
任选其一。
lib.rs
:
这是gvariant库的实现细节
依赖项
~1.5MB
~35K SLoC