#glib #deserialize

无 std gvariant

GVariant 序列化格式的纯 Rust 实现

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 编码

Download history 639/week @ 2024-03-14 573/week @ 2024-03-21 328/week @ 2024-03-28 416/week @ 2024-04-04 604/week @ 2024-04-11 530/week @ 2024-04-18 294/week @ 2024-04-25 404/week @ 2024-05-02 444/week @ 2024-05-09 748/week @ 2024-05-16 389/week @ 2024-05-23 595/week @ 2024-05-30 452/week @ 2024-06-06 698/week @ 2024-06-13 1201/week @ 2024-06-20 793/week @ 2024-06-27

每月下载量 3,272
用于 ostree-ext

MIT/Apache

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

许可证

本项目受以下任一许可证的许可

根据您的选择。

依赖项

~2MB
~41K SLoC