Skip to content

Commit a00ca6a

Browse files
committed
stuff
1 parent 720b23b commit a00ca6a

File tree

3 files changed

+87
-92
lines changed

3 files changed

+87
-92
lines changed

src/main.rs

+49-33
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,13 @@ mod parse;
22
mod render;
33

44
use std::{
5+
collections::HashMap,
56
path::{Path, PathBuf},
67
process::Command,
78
};
89

910
use eyre::{bail, Context, OptionExt, Result};
10-
use parse::{Footnote, ParsedTargetInfoFile, Tier, TriStateBool};
11+
use parse::ParsedTargetInfoFile;
1112
use serde::Deserialize;
1213

1314
/// Information about a target obtained from the target_info markdown file.
@@ -52,14 +53,24 @@ fn main() -> Result<()> {
5253
.wrap_err("failed loading target_info")?
5354
.into_iter()
5455
.map(|info| {
55-
let metadata_used = vec![false; info.metadata.len()];
56-
TargetPatternEntry { info, used: false, footnotes_used: metadata_used }
56+
let footnotes_used = info
57+
.footnotes
58+
.iter()
59+
.map(|(target, _)| (target.clone(), false))
60+
.collect();
61+
TargetPatternEntry {
62+
info,
63+
used: false,
64+
footnotes_used,
65+
}
5766
})
5867
.collect::<Vec<_>>();
5968

6069
eprintln!("Collecting rustc information");
61-
let rustc_infos =
62-
targets.iter().map(|target| rustc_target_info(&rustc, target)).collect::<Vec<_>>();
70+
let rustc_infos = targets
71+
.iter()
72+
.map(|target| rustc_target_info(&rustc, target))
73+
.collect::<Vec<_>>();
6374

6475
let targets = targets
6576
.into_iter()
@@ -68,7 +79,9 @@ fn main() -> Result<()> {
6879
.collect::<Vec<_>>();
6980

7081
eprintln!("Rendering targets check_only={check_only}");
71-
let targets_dir = Path::new(output_src).join("platform-support").join("targets");
82+
let targets_dir = Path::new(output_src)
83+
.join("platform-support")
84+
.join("targets");
7285
if !check_only {
7386
std::fs::create_dir_all(&targets_dir).wrap_err("creating platform-support/targets dir")?;
7487
}
@@ -83,17 +96,19 @@ fn main() -> Result<()> {
8396

8497
for target_pattern in info_patterns {
8598
if !target_pattern.used {
86-
bail!("target pattern `{}` was never used", target_pattern.info.pattern);
99+
bail!(
100+
"target pattern `{}` was never used",
101+
target_pattern.info.pattern
102+
);
87103
}
88104

89-
for (used, meta) in
90-
std::iter::zip(target_pattern.footnotes_used, target_pattern.info.metadata)
91-
{
105+
for footnote_target in target_pattern.info.footnotes.keys() {
106+
let used = target_pattern.footnotes_used[footnote_target];
92107
if !used {
93108
bail!(
94109
"in target pattern `{}`, the footnotes for target `{}` were never used",
95110
target_pattern.info.pattern,
96-
meta.target
111+
footnote_target,
97112
);
98113
}
99114
}
@@ -108,15 +123,14 @@ fn main() -> Result<()> {
108123
struct TargetPatternEntry {
109124
info: ParsedTargetInfoFile,
110125
used: bool,
111-
footnotes_used: Vec<bool>,
126+
footnotes_used: HashMap<String, bool>,
112127
}
113128

114129
fn target_doc_info(info_patterns: &mut [TargetPatternEntry], target: &str) -> TargetDocs {
115130
let mut tier = None;
116131
let mut maintainers = Vec::new();
117132
let mut sections = Vec::new();
118133

119-
let mut metadata = None;
120134
let mut footnotes = Vec::new();
121135

122136
for target_pattern_entry in info_patterns {
@@ -145,32 +159,24 @@ fn target_doc_info(info_patterns: &mut [TargetPatternEntry], target: &str) -> Ta
145159
}
146160

147161
if let Some(target_footnotes) = target_pattern.footnotes.get(target) {
148-
target_pattern_entry.footnotes_used[i] = true;
162+
target_pattern_entry
163+
.footnotes_used
164+
.insert(target.to_owned(), true);
149165

150166
if !footnotes.is_empty() {
151167
panic!("target {target} is assigned metadata from more than one pattern");
152168
}
153169
footnotes = target_footnotes.clone();
154170
}
155-
156-
for (i, metadata_pattern) in target_pattern.metadata.iter().enumerate() {
157-
if metadata_pattern.target == target {
158-
target_pattern_entry.footnotes_used[i] = true;
159-
if metadata.is_some() {
160-
panic!("target {target} is assigned metadata from more than one pattern");
161-
}
162-
metadata = Some(TargetMetadata {
163-
notes: metadata_pattern.notes.clone(),
164-
host: metadata_pattern.host.clone(),
165-
std: metadata_pattern.std.clone(),
166-
footnotes: metadata_pattern.footnotes.clone(),
167-
});
168-
}
169-
}
170171
}
171172
}
172173

173-
TargetDocs { name: target.to_owned(), maintainers, sections, footnotes }
174+
TargetDocs {
175+
name: target.to_owned(),
176+
maintainers,
177+
sections,
178+
footnotes,
179+
}
174180
}
175181

176182
/// Information about a target obtained from rustc.
@@ -212,11 +218,21 @@ fn rustc_target_info(rustc: &Path, target: &str) -> RustcTargetInfo {
212218

213219
let json_spec = rustc_stdout(
214220
rustc,
215-
&["-Zunstable-options", "--print", "target-spec-json", "--target", target],
221+
&[
222+
"-Zunstable-options",
223+
"--print",
224+
"target-spec-json",
225+
"--target",
226+
target,
227+
],
216228
);
217-
let spec = serde_json::from_str::<TargetJson>(&json_spec);
229+
let spec = serde_json::from_str::<TargetJson>(&json_spec)
230+
.expect("parsing --print target-spec-json for metadata");
218231

219-
RustcTargetInfo { target_cfgs, metadata: spec.metadata }
232+
RustcTargetInfo {
233+
target_cfgs,
234+
metadata: spec.metadata,
235+
}
220236
}
221237

222238
fn rustc_stdout(rustc: &Path, args: &[&str]) -> String {

src/parse.rs

+1-8
Original file line numberDiff line numberDiff line change
@@ -86,16 +86,9 @@ fn parse_file(name: &str, content: &str) -> Result<ParsedTargetInfoFile> {
8686

8787
let frontmatter_line_count = frontmatter.lines().count() + 2; // 2 from ---
8888

89-
let mut frontmatter =
89+
let frontmatter =
9090
serde_yaml::from_str::<Frontmatter>(frontmatter).wrap_err("invalid frontmatter")?;
9191

92-
frontmatter.metadata.iter_mut().for_each(|meta| {
93-
meta.footnotes.iter_mut().for_each(|footnote| {
94-
footnote.content = footnote.content.replace("\r\n", " ").replace("\n", " ")
95-
})
96-
});
97-
let frontmatter = frontmatter;
98-
9992
let body = frontmatter_splitter.next().ok_or_eyre("no body")?;
10093

10194
let mut sections = Vec::<(String, String)>::new();

src/render.rs

+37-51
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,18 @@
11
use eyre::{Context, OptionExt, Result};
22
use std::{fs, path::Path};
33

4-
use crate::{
5-
parse::{Footnote, Tier, TriStateBool},
6-
RustcTargetInfo, TargetDocs,
7-
};
8-
9-
impl TargetDocs {
10-
fn has_host_tools(&self) -> bool {
11-
self.metadata.as_ref().map_or(false, |meta| meta.host == TriStateBool::True)
12-
}
13-
}
4+
use crate::{RustcTargetInfo, TargetDocs};
145

156
/// Renders a single target markdown file from the information obtained.
167
pub fn render_target_md(target: &TargetDocs, rustc_info: &RustcTargetInfo) -> String {
178
let mut doc = format!(
189
"# {}\n\n**Tier: {}**\n\n",
1910
target.name,
20-
match target.tier {
21-
Some(Tier::One) => "1",
22-
Some(Tier::Two) => "2",
23-
Some(Tier::Three) => "3",
24-
None => "UNKNOWN",
11+
match rustc_info.metadata.tier {
12+
Some(1) => "1",
13+
Some(2) => "2",
14+
Some(3) => "3",
15+
_ => "UNKNOWN",
2516
}
2617
);
2718

@@ -61,7 +52,10 @@ pub fn render_target_md(target: &TargetDocs, rustc_info: &RustcTargetInfo) -> St
6152
section("Maintainers", &maintainers_content);
6253

6354
for section_name in crate::SECTIONS {
64-
let value = target.sections.iter().find(|(name, _)| name == section_name);
55+
let value = target
56+
.sections
57+
.iter()
58+
.find(|(name, _)| name == section_name);
6559

6660
let section_content = match value {
6761
Some((_, value)) => value.clone(),
@@ -141,12 +135,6 @@ pub fn render_static(
141135
Ok(())
142136
}
143137

144-
impl Footnote {
145-
fn reference(&self) -> String {
146-
format!("[^{}]", self.name)
147-
}
148-
}
149-
150138
fn render_platform_support_tables(
151139
content: &str,
152140
targets: &[(TargetDocs, RustcTargetInfo)],
@@ -160,7 +148,7 @@ fn render_platform_support_tables(
160148
content,
161149
"TIER1HOST",
162150
TierTable {
163-
filter: |target| target.tier == Some(Tier::One),
151+
filter: |target| target.1.metadata.tier == Some(1),
164152
include_host: false,
165153
include_std: false,
166154
},
@@ -169,7 +157,9 @@ fn render_platform_support_tables(
169157
&content,
170158
"TIER2HOST",
171159
TierTable {
172-
filter: |target| target.tier == Some(Tier::Two) && target.has_host_tools(),
160+
filter: |target| {
161+
target.1.metadata.tier == Some(2) && target.1.metadata.host_tools.unwrap_or(false)
162+
},
173163
include_host: false,
174164
include_std: false,
175165
},
@@ -178,7 +168,9 @@ fn render_platform_support_tables(
178168
&content,
179169
"TIER2",
180170
TierTable {
181-
filter: |target| target.tier == Some(Tier::Two) && !target.has_host_tools(),
171+
filter: |target| {
172+
target.1.metadata.tier == Some(2) && !target.1.metadata.host_tools.unwrap_or(false)
173+
},
182174
include_host: false,
183175
include_std: true,
184176
},
@@ -187,7 +179,7 @@ fn render_platform_support_tables(
187179
&content,
188180
"TIER3",
189181
TierTable {
190-
filter: |target| target.tier == Some(Tier::Three),
182+
filter: |target| target.1.metadata.tier == Some(3),
191183
include_host: true,
192184
include_std: true,
193185
},
@@ -196,49 +188,50 @@ fn render_platform_support_tables(
196188
Ok(content)
197189
}
198190

199-
fn render_table_tri_state_bool(bool: TriStateBool) -> &'static str {
191+
fn render_table_option_bool(bool: Option<bool>) -> &'static str {
200192
match bool {
201-
TriStateBool::True => "✓",
202-
TriStateBool::False => " ",
203-
TriStateBool::Unknown => "?",
193+
Some(true) => "✓",
194+
Some(false) => " ",
195+
None => "?",
204196
}
205197
}
206198

207199
struct TierTable {
208-
filter: fn(&TargetDocs) -> bool,
200+
filter: fn(&(TargetDocs, RustcTargetInfo)) -> bool,
209201
include_std: bool,
210202
include_host: bool,
211203
}
212204

213205
fn render_table(targets: &[(TargetDocs, RustcTargetInfo)], table: TierTable) -> Result<String> {
214206
let mut rows = Vec::new();
215-
let mut all_footnotes = Vec::new();
216207

217-
let targets = targets.into_iter().filter(|target| (table.filter)(&target.0));
208+
let targets = targets.into_iter().filter(|target| (table.filter)(&target));
218209

219-
for (target, _) in targets {
220-
let meta = target.metadata.as_ref();
210+
for (target, rustc_info) in targets {
211+
let meta = &rustc_info.metadata;
221212

222-
let mut notes = meta.map(|meta| meta.notes.as_str()).unwrap_or("unknown").to_owned();
213+
let mut notes = meta.description.as_deref().unwrap_or("unknown").to_owned();
223214

224-
if meta.map_or(false, |meta| !meta.footnotes.is_empty()) {
225-
let footnotes = &meta.unwrap().footnotes;
226-
all_footnotes.extend(footnotes);
227-
let footnotes_str =
228-
footnotes.iter().map(|footnote| footnote.reference()).collect::<Vec<_>>().join(" ");
215+
if !target.footnotes.is_empty() {
216+
let footnotes_str = target
217+
.footnotes
218+
.iter()
219+
.map(|footnote| format!("[^{}]", footnote))
220+
.collect::<Vec<_>>()
221+
.join(" ");
229222

230223
notes = format!("{notes} {footnotes_str}");
231224
}
232225

233226
let std = if table.include_std {
234-
let std = meta.map(|meta| render_table_tri_state_bool(meta.std)).unwrap_or("?");
227+
let std = render_table_option_bool(meta.std);
235228
format!(" | {std}")
236229
} else {
237230
String::new()
238231
};
239232

240233
let host = if table.include_host {
241-
let host = meta.map(|meta| render_table_tri_state_bool(meta.host)).unwrap_or("?");
234+
let host = render_table_option_bool(meta.host_tools);
242235
format!(" | {host}")
243236
} else {
244237
String::new()
@@ -250,14 +243,7 @@ fn render_table(targets: &[(TargetDocs, RustcTargetInfo)], table: TierTable) ->
250243
));
251244
}
252245

253-
let mut result = rows.join("\n");
254-
255-
for footnote in all_footnotes {
256-
result.push_str("\n\n");
257-
result.push_str(&footnote.reference());
258-
result.push_str(": ");
259-
result.push_str(&footnote.content);
260-
}
246+
let result = rows.join("\n");
261247

262248
Ok(result)
263249
}

0 commit comments

Comments
 (0)