6 个版本

0.2.2 2022年1月16日
0.2.1 2021年7月14日
0.2.0 2020年9月4日
0.1.2 2020年8月13日

#845硬件支持

Download history 44/week @ 2024-03-14 29/week @ 2024-03-21 33/week @ 2024-03-28 43/week @ 2024-04-04 37/week @ 2024-04-11 20/week @ 2024-04-18 10/week @ 2024-04-25 2/week @ 2024-05-02 13/week @ 2024-05-09 17/week @ 2024-05-16 12/week @ 2024-05-23 19/week @ 2024-05-30 33/week @ 2024-06-06 33/week @ 2024-06-13 25/week @ 2024-06-20 11/week @ 2024-06-27

每月106次下载

MIT 许可证

185KB
3.5K SLoC

appstream

使用 Rust 和 xmltree 编写的 Appstream 文件解析器

规范: https://www.freedesktop.org/software/appstream/docs/

如何使用

use appstream::{Collection, Component, ParseError};

fn main() -> Result<(), ParseError> {
    let collection = Collection::from_path("/var/lib/flatpak/appstream/flathub/x86_64/active/appstream.xml".into())?;
    // Find a specific application by id
    println!("{:#?}", collection.find_by_id("org.gnome.design.Contrast".into()));

    // Find the list of gedit plugins
    collection.components.iter()
        .filter(|c| c.extends.contains(&"org.gnome.gedit".into()))
        .collect::<Vec<&Component>>();
        
    Ok(())
}

lib.rs:

Appstream

AppStream 是一个跨发行版的努力,旨在增强 Linux 和自由软件生态系统中软件组件的元数据。该项目的一个目标是通过软件中心应用构建软件,并使与发行版包源的交互更智能。AppStream 为由上游项目提供并由其他软件消费的元信息提供规范。元信息包括在软件中心中显示的数据,主要对最终用户有用,以及关于软件组件提供的公共接口的描述,主要对开发者、第三方软件安装程序以及自动在发行版上安装缺少的组件(例如缺少的固件或MIME类型处理器)有用。

规范: https://www.freedesktop.org/software/appstream/docs/

这个crate旨在提供一个简单合理的Rust解析器,用于解析Appstream,使用xmltree

示例

use appstream::{Component, ParseError};
use appstream::builders::{ComponentBuilder, ReleaseBuilder};
use appstream::TranslatableString;
use appstream::enums::{Provide, ProjectUrl};
use url::Url;
use chrono::{Utc, TimeZone};
use std::convert::TryFrom;

fn main() -> Result<(), ParseError> {

    let xml = r"<?xml version='1.0' encoding='UTF-8'?>
                    <component>
                        <id>com.example.foobar</id>
                        <name>Foo Bar</name>
                        <summary>A foo-ish bar</summary>
                        <url type='homepage'>http://www.example.org</url>
                        <metadata_license>CC0-1.0</metadata_license>
                        
                        <provides>
                          <library>libfoobar.so.2</library>
                          <font>foo.ttf</font>
                          <binary>foobar</binary>
                        </provides>
                        <releases>
                          <release version='1.2' date='2015-02-16'/>
                        </releases>
                        <developer_name>FooBar Team</developer_name>
                    </component>";
    let element = xmltree::Element::parse(xml.as_bytes())?;
    let c1 = Component::try_from(&element)?;

    let c2 = ComponentBuilder::default()
        .id("com.example.foobar".into())
        .name(TranslatableString::with_default("Foo Bar"))
        .metadata_license("CC0-1.0".into())
        .summary(TranslatableString::with_default("A foo-ish bar"))
        .url(ProjectUrl::Homepage(
            Url::parse("http://www.example.org")?,
        ))
        .developer_name(TranslatableString::with_default("FooBar Team"))
        .provide(Provide::Library("libfoobar.so.2".into()))
        .provide(Provide::Font("foo.ttf".into()))
        .provide(Provide::Binary("foobar".into()))
        .release(
            ReleaseBuilder::new("1.2")
                .date(Utc.ymd(2015, 2, 16).and_hms_milli(0, 0, 0, 0))
                .build(),
        )
        .build();

    assert_eq!(c1, c2);
    
    Ok(())
}

该库还可以解析组件集合

use appstream::{Collection, Component, ParseError};

fn main() -> Result<(), ParseError> {
    let collection = Collection::from_path("/var/lib/flatpak/appstream/flathub/x86_64/active/appstream.xml".into())?;
    #[cfg(feature="gzip")]
    let collection = Collection::from_gzipped("/var/lib/flatpak/appstream/flathub/x86_64/active/appstream.xml.gz".into())?;
    // Find a specific application by id
    println!("{:#?}", collection.find_by_id("org.gnome.design.Contrast".into()));

    // Find the list of gedit plugins
    collection.components.iter()
        .filter(|c| c.extends.contains(&"org.gnome.gedit".into()))
        .collect::<Vec<&Component>>();

    Ok(())
}

依赖项

~5MB
~123K SLoC