#channel #metadata #release

rust_release_channel

Rust发布频道元数据的数据结构

3 个版本 (破坏性更新)

使用旧版Rust 2015

0.3.0 2018年7月17日
0.2.0 2018年6月26日
0.1.0 2018年4月2日

#release 中排名第 50

MIT/Apache

70KB
1K SLoC

rust_release_channel: Rust发布频道元数据的数据结构

仓库:https://gitlab.com/Screwtapello/rust_release_channel/

文档:https://docs.rs/rust_release_channel

待办事项

  • 将哈希值存储为字节而不是十六进制编码的字节?
    • 可能更容易与其他哈希函数的结果进行比较
  • impl Display for Channel 格式化为TOML,而不是当前的可读输出?这样我们就可以用实际的 ToString trait 来替换我们的自定义 .to_string() 方法,这可能不那么令人惊讶。

lib.rs:

Rust发布频道元数据的数据结构

简介

Rust工具链的新版本以每六周为一个周期发布。每个版本都描述在已知位置的发布频道元数据文件中,使自动化工具能够检测新版本并找到每个支持平台的工具和组件。

此库中的数据结构表示每个元数据文件中存在的信息,组织方式有助于您提取所需的具体信息。

此库旨在处理清单文件格式的第2版。

最重要的类是 Channel,因此您应该从那里开始。

第一个示例

 extern crate rust_release_channel;
 use std::error::Error;

 fn dump_manifest_info(input: &str) -> Result<(), Box<Error>> {
     // Parse the manifest into a data structure.
     let channel: rust_release_channel::Channel = input.parse()?;

     // Check the manifest is sensible before we use it.
     let errors = channel.validate();
     if errors.is_empty() {
         // Dump a summary of the manifest data
         println!(
             "Channel manifest created on {}",
             channel.date,
         );
         println!("Included packages:");
         for (name, pkg) in channel.pkg.iter() {
             println!("  - {} version {}", name, pkg.version);
         }
     } else {
         println!("Channel has problems:");
         for each in errors {
             println!("  - {}", each);
         }
     }

     Ok(())
 }

功能

读取清单

如果您能读取现有清单文件的内容,您可以使用标准 FromStr trait 的 .parse() 方法将其转换为可查询、可探索的数据结构。

 # extern crate rust_release_channel;
 # use std::error::Error;
 # fn example1() -> Result<(), Box<Error>> {
 # let my_str = r#"metadata-version = "2"\ndate = "2018-02-26"\n"#;
 use rust_release_channel::Channel;

 let channel: Channel = my_str.parse()?;
 # Ok(())
 # }

读取清单后,您应该调用 .validate() 来检查数据是否合理,然后再信任它。

查询清单

清单中的所有内容都可以像原生Rust数据结构一样进行检查。例如,当本地清单文件格式将不同的文件格式作为具有相同含义的不同名称的键进行模型时(如urlxz_urlhashxz_hash),rust_release_channel为您提供从ArchiveFormatArchiveSource的映射。

 # extern crate rust_release_channel;
 # use std::error::Error;
 # fn example2() -> Result<(), Box<Error>> {
 # let my_str = r#"metadata-version = "2"\ndate = "2018-02-26"\n"#;
 # let channel: rust_release_channel::Channel = my_str.parse()?;
 use rust_release_channel::{ArtefactQuery, ArchiveFormat};

 let rust_for_aarch64_url = channel.lookup_artefact(
         ArtefactQuery::new("rust", "aarch64-unknown-linux-gnu"),
     )
     .and_then(|artefact| {
          artefact.standalone.get(&ArchiveFormat::TarGzip)
     })
     .map(|archive| { &archive.url });
 # Ok(())
 # }

创建新的清单

如果您需要为另一个系统创建测试数据,您也可以从头开始创建清单数据。

 # extern crate rust_release_channel;
 # extern crate chrono;
 # use std::error::Error;
 # fn example3() -> Result<(), Box<Error>> {
 use rust_release_channel::{
     Channel,
     Package,
     Artefact,
     ArchiveFormat,
     ArchiveSource,
 };

 let source = ArchiveSource::new(
     "https://example.com/rust/mypackage-linux-x86.tar.gz".parse()?,
     "aa0a89d80329fec6f9e84b79c1674c5427034408630c35da1be442c7da6d2364"
         .into(),
 );

 let mut artefact = Artefact::new();
 artefact.standalone.insert(ArchiveFormat::TarGzip, source);

 let mut mypackage = Package::new("1.2.3 (abc1234 2018-02-26)".into());
 mypackage.target.insert("x86_64-unknown-linux-gnu".into(), artefact);

 let mut channel = Channel::new();
 channel.pkg.insert("mypackage".into(), mypackage);
 # Ok(())
 # }

编写清单

您可以使用.to_string()方法将清单数据转换回字符串。如果您序列化一个Channel然后再次反序列化它,结果应该与原始内容相同。

 # extern crate rust_release_channel;
 # use std::error::Error;
 # fn example3() -> Result<(), Box<Error>> {
 # let channel = rust_release_channel::Channel::new();
 let manifest_string = channel.to_string()?;
 # Ok(())
 # }

在编写清单之前,您应该调用.validate()以检查您是否未将元数据留在不一致的状态。

依赖项

~2.6–3.5MB
~93K SLoC