mirror of
https://github.com/Noratrieb/target-tier-docs-experiment.git
synced 2026-01-14 16:35:09 +01:00
more tables
This commit is contained in:
parent
f4493e17b2
commit
09ee1f7a33
3 changed files with 123 additions and 39 deletions
11
src/main.rs
11
src/main.rs
|
|
@ -8,7 +8,7 @@ use std::{
|
|||
};
|
||||
|
||||
use eyre::{bail, Context, OptionExt, Result};
|
||||
use parse::ParsedTargetInfoFile;
|
||||
use parse::{ParsedTargetInfoFile, Tier, TriStateBool};
|
||||
use rayon::iter::{IntoParallelRefIterator, ParallelIterator};
|
||||
|
||||
/// Information about a target obtained from `target_info.toml``.
|
||||
|
|
@ -16,7 +16,7 @@ struct TargetDocs {
|
|||
name: String,
|
||||
maintainers: Vec<String>,
|
||||
sections: Vec<(String, String)>,
|
||||
tier: String,
|
||||
tier: Option<Tier>,
|
||||
// TODO: Make this mandatory.
|
||||
metadata: Option<TargetMetadata>,
|
||||
}
|
||||
|
|
@ -24,8 +24,8 @@ struct TargetDocs {
|
|||
/// Metadata for the table
|
||||
struct TargetMetadata {
|
||||
notes: String,
|
||||
std: String,
|
||||
host: String,
|
||||
std: TriStateBool,
|
||||
host: TriStateBool,
|
||||
}
|
||||
|
||||
const SECTIONS: &[&str] = &[
|
||||
|
|
@ -182,8 +182,7 @@ fn target_doc_info(info_patterns: &mut [TargetPatternEntry], target: &str) -> Ta
|
|||
TargetDocs {
|
||||
name: target.to_owned(),
|
||||
maintainers,
|
||||
// tier: tier.expect(&format!("no tier found for target {target}")),
|
||||
tier: tier.unwrap_or("UNKNOWN".to_owned()),
|
||||
tier,
|
||||
sections,
|
||||
metadata,
|
||||
}
|
||||
|
|
|
|||
35
src/parse.rs
35
src/parse.rs
|
|
@ -1,34 +1,53 @@
|
|||
//! Suboptimal half-markdown parser that's just good-enough for this.
|
||||
|
||||
use eyre::{bail, OptionExt, Result, WrapErr};
|
||||
use serde::Deserialize;
|
||||
use std::{fs::DirEntry, path::Path};
|
||||
|
||||
#[derive(Debug, PartialEq, Clone, Deserialize)]
|
||||
pub enum Tier {
|
||||
#[serde(rename = "1")]
|
||||
One,
|
||||
#[serde(rename = "2")]
|
||||
Two,
|
||||
#[serde(rename = "3")]
|
||||
Three,
|
||||
}
|
||||
|
||||
#[derive(Debug)]
|
||||
pub struct ParsedTargetInfoFile {
|
||||
pub pattern: String,
|
||||
pub tier: Option<String>,
|
||||
pub tier: Option<Tier>,
|
||||
pub maintainers: Vec<String>,
|
||||
pub sections: Vec<(String, String)>,
|
||||
pub metadata: Vec<ParsedTargetMetadata>,
|
||||
}
|
||||
|
||||
#[derive(serde::Deserialize)]
|
||||
#[derive(Deserialize)]
|
||||
#[serde(deny_unknown_fields)]
|
||||
struct Frontmatter {
|
||||
tier: Option<String>,
|
||||
tier: Option<Tier>,
|
||||
#[serde(default)]
|
||||
maintainers: Vec<String>,
|
||||
#[serde(default)]
|
||||
metadata: Vec<ParsedTargetMetadata>,
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, serde::Deserialize)]
|
||||
#[derive(Debug, Clone, Deserialize)]
|
||||
#[serde(deny_unknown_fields)]
|
||||
pub struct ParsedTargetMetadata {
|
||||
pub pattern: String,
|
||||
pub notes: String,
|
||||
pub std: String,
|
||||
pub host: String,
|
||||
pub std: TriStateBool,
|
||||
pub host: TriStateBool,
|
||||
}
|
||||
|
||||
#[derive(Debug, PartialEq, Clone, Copy, Deserialize)]
|
||||
#[serde(rename_all = "snake_case")]
|
||||
pub enum TriStateBool {
|
||||
True,
|
||||
False,
|
||||
Unknown,
|
||||
}
|
||||
|
||||
pub fn load_target_infos(directory: &Path) -> Result<Vec<ParsedTargetInfoFile>> {
|
||||
|
|
@ -112,6 +131,8 @@ fn parse_file(name: &str, content: &str) -> Result<ParsedTargetInfoFile> {
|
|||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use crate::parse::Tier;
|
||||
|
||||
#[test]
|
||||
fn no_frontmatter() {
|
||||
let name = "archlinux-unknown-linux-gnu.md"; // arch linux is an arch, right?
|
||||
|
|
@ -171,7 +192,7 @@ But it should be possible.
|
|||
|
||||
assert_eq!(info.maintainers, vec!["who maintains the cat?"]);
|
||||
assert_eq!(info.pattern, name);
|
||||
assert_eq!(info.tier, Some("1".to_owned()));
|
||||
assert_eq!(info.tier, Some(Tier::One));
|
||||
assert_eq!(
|
||||
info.sections,
|
||||
vec | {std} | {host} | {notes}",
|
||||
|
|
@ -175,3 +219,23 @@ fn render_table_with_host<'a>(
|
|||
|
||||
Ok(rows.join("\n"))
|
||||
}
|
||||
|
||||
fn render_table<'a>(
|
||||
targets: impl IntoIterator<Item = &'a (TargetDocs, RustcTargetInfo)>,
|
||||
) -> Result<String> {
|
||||
let mut rows = Vec::new();
|
||||
|
||||
for (target, _) in targets {
|
||||
let meta = target.metadata.as_ref();
|
||||
let std = meta
|
||||
.map(|meta| render_table_tri_state_bool(meta.std))
|
||||
.unwrap_or("?");
|
||||
let notes = meta.map(|meta| meta.notes.as_str()).unwrap_or("unknown");
|
||||
rows.push(format!(
|
||||
"[`{0}`](platform-support/targets/{0}.md) | {std} | {notes}",
|
||||
target.name
|
||||
));
|
||||
}
|
||||
|
||||
Ok(rows.join("\n"))
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue