#gvariant #macro #proc #proc-macro #buffer

gvariant-macro

为gvariant库提供过程宏

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

Download history 555/week @ 2024-04-09 577/week @ 2024-04-16 420/week @ 2024-04-23 375/week @ 2024-04-30 294/week @ 2024-05-07 696/week @ 2024-05-14 498/week @ 2024-05-21 515/week @ 2024-05-28 473/week @ 2024-06-04 643/week @ 2024-06-11 1054/week @ 2024-06-18 1081/week @ 2024-06-25 407/week @ 2024-07-02 492/week @ 2024-07-09 804/week @ 2024-07-16 415/week @ 2024-07-23

每月下载量 2,344
2 个库中使用(通过 gvariant

MIT/Apache

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

许可证

该项目根据以下其中之一授权:

任选其一。


lib.rs:

这是gvariant库的实现细节

依赖项

~1.5MB
~35K SLoC