gh_stack/
markdown.rs

1use regex::Regex;
2use std::fs;
3
4use crate::api::search::PullRequestStatus;
5use crate::graph::FlatDep;
6
7fn process(row: String) -> String {
8    // TODO: Make this configurable
9    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}