1use regex::Regex;
2use std::fs;
3
4use crate::api::search::PullRequestStatus;
5use crate::graph::FlatDep;
6
7fn process(row: String) -> String {
8 let regex = Regex::new(r"\[HEAP-\d+\]\s*").unwrap();
10 regex.replace_all(&row, "").into_owned()
11}
12
13pub fn build_table(deps: &FlatDep, title: &str, prelude_path: Option<&str>) -> String {
14 let is_complete = deps
15 .iter()
16 .all(|(node, _)| node.state() == &PullRequestStatus::Closed);
17
18 let mut out = String::new();
19
20 if let Some(prelude_path) = prelude_path {
21 let prelude = fs::read_to_string(prelude_path).unwrap();
22 out.push_str(&prelude);
23 out.push_str("\n");
24 }
25
26 if is_complete {
27 out.push_str(&format!("### ✅ Stacked PR Chain: {}\n", title));
28 } else {
29 out.push_str(&format!("### Stacked PR Chain: {}\n", title));
30 }
31 out.push_str("| PR | Title | Merges Into |\n");
32 out.push_str("|:--:|:------|:-------------:|\n");
33
34 for (node, parent) in deps {
35 let row = match (node.state(), parent) {
36 (PullRequestStatus::Closed, _) => format!(
37 "|#{}|{}|**Merged**|\n",
38 node.number(),
39 node.title()
40 ),
41 (_, Some(parent)) => format!(
42 "|#{}|{}|#{}|\n",
43 node.number(),
44 node.title(),
45 parent.number()
46 ),
47 (_, None) => format!(
48 "|#{}|{}|**{}**|\n",
49 node.number(),
50 node.title(),
51 node.note()
52 ),
53 };
54
55 out.push_str(&process(row));
56 }
57
58 out
59}