19个版本

0.7.1 2024年8月11日
0.7.0 2024年7月12日
0.6.1 2024年2月23日
0.5.3 2023年12月2日
0.2.2 2022年6月15日

#133 in 编码

Download history 1089/week @ 2024-05-03 1069/week @ 2024-05-10 1123/week @ 2024-05-17 1317/week @ 2024-05-24 1120/week @ 2024-05-31 1106/week @ 2024-06-07 2298/week @ 2024-06-14 1619/week @ 2024-06-21 1272/week @ 2024-06-28 1140/week @ 2024-07-05 1484/week @ 2024-07-12 961/week @ 2024-07-19 1334/week @ 2024-07-26 1021/week @ 2024-08-02 1244/week @ 2024-08-09 920/week @ 2024-08-16

4,650 每月下载量
用于 4 个crate (2 直接)

MIT/Apache

190KB
4K SLoC

关于此crate

这是Rust中glib GVariant数据库文件格式的实现。它包括GResource XML解析器和创建兼容GResource文件的能力。

Crates.io

MSRV

此crate最低支持的Rust版本是1.75。

示例

创建GResource文件

使用GResourceXMLDocumentGResourceBuilder从XML创建GResource文件。

需要启用gresource特性。

#[cfg(feature = "gresource")]
mod gresource {
    use std::borrow::Cow;
    use std::path::PathBuf;
    use gvdb::gresource::BundleBuilder;
    use gvdb::gresource::XmlManifest;
    use gvdb::read::File;

    const GRESOURCE_XML: &str = "test-data/gresource/test3.gresource.xml";

    fn create_gresource() {
        let doc = XmlManifest::from_file(&PathBuf::from(GRESOURCE_XML)).unwrap();
        let builder = BundleBuilder::from_xml(doc).unwrap();
        let data = builder.build().unwrap();
        
        // To immediately read this data again, we can create a file reader from the data
        let root = File::from_bytes(Cow::Owned(data)).unwrap();
    }
}

使用FileWriter创建简单的GVDB文件

use gvdb::write::{FileWriter, HashTableBuilder};

fn create_gvdb_file() {
    let mut file_writer = FileWriter::new();
    let mut table_builder = HashTableBuilder::new();
    table_builder
           .insert_string("string", "test string")
           .unwrap();
    let mut table_builder_2 = HashTableBuilder::new();
    table_builder_2
        .insert("int", 42u32)
        .unwrap();

    table_builder
        .insert_table("table", table_builder_2)
        .unwrap();
    let file_data = file_writer.write_to_vec_with_table(table_builder).unwrap();
}

读取GVDB文件

存储在/gvdb/rs/test/online-symbolic.svg中的数据对应于(uuay) GVariant类型签名。

use gvdb::read::File;
use std::path::PathBuf;

pub fn main() {
    let path = PathBuf::from("test-data/test3.gresource");
    let file = File::from_file(&path).unwrap();
    let table = file.hash_table().unwrap();

    #[derive(serde::Deserialize, zvariant::Type)]
    struct GResourceData {
        size: u32,
        flags: u32,
        content: Vec<u8>,
    }

    let svg: GResourceData = table.get("/gvdb/rs/test/online-symbolic.svg").unwrap();

    assert_eq!(svg.size, 1390);
    assert_eq!(svg.flags, 0);
    assert_eq!(svg.size as usize, svg.content.len() - 1);

    // Ensure the last byte is zero because of zero-padding defined in the format
    assert_eq!(svg.content[svg.content.len() - 1], 0);
    let svg_str = std::str::from_utf8(&svg.content[0..svg.content.len() - 1]).unwrap();

    println!("{}", svg_str);
}

许可

gvdbgvdb-macros在MIT OR Apache-2.0许可下可用。请参阅LICENSES文件夹中的完整许可文本。

test-data/gresource/icons/中包含的SVG图标文件在CC0-1.0许可下可用,并从Icon Development Kit重新分发。请参阅CC0-1.0.txt和文件以获取完整的许可文本。

依赖项

~3–11MB
~128K SLoC