mirror of
https://github.com/Noratrieb/target-tier-docs-experiment.git
synced 2026-01-16 09:25:08 +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 eyre::{bail, Context, OptionExt, Result};
|
||||||
use parse::ParsedTargetInfoFile;
|
use parse::{ParsedTargetInfoFile, Tier, TriStateBool};
|
||||||
use rayon::iter::{IntoParallelRefIterator, ParallelIterator};
|
use rayon::iter::{IntoParallelRefIterator, ParallelIterator};
|
||||||
|
|
||||||
/// Information about a target obtained from `target_info.toml``.
|
/// Information about a target obtained from `target_info.toml``.
|
||||||
|
|
@ -16,7 +16,7 @@ struct TargetDocs {
|
||||||
name: String,
|
name: String,
|
||||||
maintainers: Vec<String>,
|
maintainers: Vec<String>,
|
||||||
sections: Vec<(String, String)>,
|
sections: Vec<(String, String)>,
|
||||||
tier: String,
|
tier: Option<Tier>,
|
||||||
// TODO: Make this mandatory.
|
// TODO: Make this mandatory.
|
||||||
metadata: Option<TargetMetadata>,
|
metadata: Option<TargetMetadata>,
|
||||||
}
|
}
|
||||||
|
|
@ -24,8 +24,8 @@ struct TargetDocs {
|
||||||
/// Metadata for the table
|
/// Metadata for the table
|
||||||
struct TargetMetadata {
|
struct TargetMetadata {
|
||||||
notes: String,
|
notes: String,
|
||||||
std: String,
|
std: TriStateBool,
|
||||||
host: String,
|
host: TriStateBool,
|
||||||
}
|
}
|
||||||
|
|
||||||
const SECTIONS: &[&str] = &[
|
const SECTIONS: &[&str] = &[
|
||||||
|
|
@ -182,8 +182,7 @@ fn target_doc_info(info_patterns: &mut [TargetPatternEntry], target: &str) -> Ta
|
||||||
TargetDocs {
|
TargetDocs {
|
||||||
name: target.to_owned(),
|
name: target.to_owned(),
|
||||||
maintainers,
|
maintainers,
|
||||||
// tier: tier.expect(&format!("no tier found for target {target}")),
|
tier,
|
||||||
tier: tier.unwrap_or("UNKNOWN".to_owned()),
|
|
||||||
sections,
|
sections,
|
||||||
metadata,
|
metadata,
|
||||||
}
|
}
|
||||||
|
|
|
||||||
35
src/parse.rs
35
src/parse.rs
|
|
@ -1,34 +1,53 @@
|
||||||
//! Suboptimal half-markdown parser that's just good-enough for this.
|
//! Suboptimal half-markdown parser that's just good-enough for this.
|
||||||
|
|
||||||
use eyre::{bail, OptionExt, Result, WrapErr};
|
use eyre::{bail, OptionExt, Result, WrapErr};
|
||||||
|
use serde::Deserialize;
|
||||||
use std::{fs::DirEntry, path::Path};
|
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)]
|
#[derive(Debug)]
|
||||||
pub struct ParsedTargetInfoFile {
|
pub struct ParsedTargetInfoFile {
|
||||||
pub pattern: String,
|
pub pattern: String,
|
||||||
pub tier: Option<String>,
|
pub tier: Option<Tier>,
|
||||||
pub maintainers: Vec<String>,
|
pub maintainers: Vec<String>,
|
||||||
pub sections: Vec<(String, String)>,
|
pub sections: Vec<(String, String)>,
|
||||||
pub metadata: Vec<ParsedTargetMetadata>,
|
pub metadata: Vec<ParsedTargetMetadata>,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(serde::Deserialize)]
|
#[derive(Deserialize)]
|
||||||
#[serde(deny_unknown_fields)]
|
#[serde(deny_unknown_fields)]
|
||||||
struct Frontmatter {
|
struct Frontmatter {
|
||||||
tier: Option<String>,
|
tier: Option<Tier>,
|
||||||
#[serde(default)]
|
#[serde(default)]
|
||||||
maintainers: Vec<String>,
|
maintainers: Vec<String>,
|
||||||
#[serde(default)]
|
#[serde(default)]
|
||||||
metadata: Vec<ParsedTargetMetadata>,
|
metadata: Vec<ParsedTargetMetadata>,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Clone, serde::Deserialize)]
|
#[derive(Debug, Clone, Deserialize)]
|
||||||
#[serde(deny_unknown_fields)]
|
#[serde(deny_unknown_fields)]
|
||||||
pub struct ParsedTargetMetadata {
|
pub struct ParsedTargetMetadata {
|
||||||
pub pattern: String,
|
pub pattern: String,
|
||||||
pub notes: String,
|
pub notes: String,
|
||||||
pub std: String,
|
pub std: TriStateBool,
|
||||||
pub host: String,
|
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>> {
|
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)]
|
#[cfg(test)]
|
||||||
mod tests {
|
mod tests {
|
||||||
|
use crate::parse::Tier;
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn no_frontmatter() {
|
fn no_frontmatter() {
|
||||||
let name = "archlinux-unknown-linux-gnu.md"; // arch linux is an arch, right?
|
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.maintainers, vec!["who maintains the cat?"]);
|
||||||
assert_eq!(info.pattern, name);
|
assert_eq!(info.pattern, name);
|
||||||
assert_eq!(info.tier, Some("1".to_owned()));
|
assert_eq!(info.tier, Some(Tier::One));
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
info.sections,
|
info.sections,
|
||||||
vec | {std} | {host} | {notes}",
|
"[`{0}`](platform-support/targets/{0}.md) | {std} | {host} | {notes}",
|
||||||
|
|
@ -175,3 +219,23 @@ fn render_table_with_host<'a>(
|
||||||
|
|
||||||
Ok(rows.join("\n"))
|
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