in eden/scm/lib/dag/src/render/ascii_large.rs [64:260]
fn next_row(
&mut self,
node: N,
parents: Vec<Ancestor<N>>,
glyph: String,
message: String,
) -> String {
let line = self.inner.next_row(node, parents, glyph, message);
let mut out = String::new();
let mut message_lines = line
.message
.lines()
.pad_using(self.options.min_row_height, |_| "");
let mut need_extra_pad_line = false;
// Render the previous extra pad line
if let Some(extra_pad_line) = self.extra_pad_line.take() {
out.push_str(extra_pad_line.trim_end());
out.push_str("\n");
}
// Render the nodeline
let mut node_line = String::new();
for (i, entry) in line.node_line.iter().enumerate() {
match entry {
NodeLine::Node => {
if i > 0 {
node_line.push_str(" ");
}
node_line.push_str(&line.glyph);
node_line.push_str(" ");
}
NodeLine::Parent => node_line.push_str(if i > 0 { " | " } else { "| " }),
NodeLine::Ancestor => node_line.push_str(if i > 0 { " . " } else { ". " }),
NodeLine::Blank => node_line.push_str(if i > 0 { " " } else { " " }),
}
}
if let Some(msg) = message_lines.next() {
node_line.push_str(" ");
node_line.push_str(msg);
}
out.push_str(node_line.trim_end());
out.push_str("\n");
// Render the link line
if let Some(link_row) = line.link_line {
let mut top_link_line = String::new();
let mut bot_link_line = String::new();
for (i, cur) in link_row.iter().enumerate() {
// Top left
if i > 0 {
if cur.contains(LinkLine::LEFT_MERGE) {
top_link_line.push_str("/");
} else if cur.contains(LinkLine::HORIZONTAL) {
top_link_line.push_str("_");
} else {
top_link_line.push_str(" ");
}
}
// Top center
if cur.contains(LinkLine::CHILD | LinkLine::PARENT) {
top_link_line.push_str("|");
} else if cur.contains(LinkLine::CHILD | LinkLine::ANCESTOR) {
top_link_line.push_str(".");
} else if cur.contains(LinkLine::ANY_MERGE) {
top_link_line.push_str(" ");
} else if cur.contains(LinkLine::HORIZONTAL) {
top_link_line.push_str("_");
} else if cur.contains(LinkLine::PARENT) {
top_link_line.push_str("|");
} else if cur.contains(LinkLine::ANCESTOR) {
top_link_line.push_str(".");
} else {
top_link_line.push_str(" ");
}
// Top right
if cur.contains(LinkLine::RIGHT_MERGE) {
top_link_line.push_str("\\");
} else if cur.contains(LinkLine::HORIZONTAL) {
top_link_line.push_str("_");
} else {
top_link_line.push_str(" ");
}
// Bottom left
if i > 0 {
if cur.contains(LinkLine::LEFT_FORK) {
bot_link_line.push_str("\\");
} else {
bot_link_line.push_str(" ");
}
}
// Bottom center
if cur.contains(LinkLine::PARENT) {
bot_link_line.push_str("|");
} else if cur.contains(LinkLine::ANCESTOR) {
bot_link_line.push_str(".");
} else {
bot_link_line.push_str(" ");
}
// Bottom Right
if cur.contains(LinkLine::RIGHT_FORK) {
bot_link_line.push_str("/");
} else {
bot_link_line.push_str(" ");
}
}
if let Some(msg) = message_lines.next() {
top_link_line.push_str(" ");
top_link_line.push_str(msg);
}
if let Some(msg) = message_lines.next() {
bot_link_line.push_str(" ");
bot_link_line.push_str(msg);
}
out.push_str(top_link_line.trim_end());
out.push_str("\n");
out.push_str(bot_link_line.trim_end());
out.push_str("\n");
}
// Render the term line
if let Some(term_row) = line.term_line {
let term_strs = ["| ", "~ "];
for term_str in term_strs.iter() {
let mut term_line = String::new();
for (i, term) in term_row.iter().enumerate() {
if i > 0 {
term_line.push_str(" ");
}
if *term {
term_line.push_str(term_str);
} else {
term_line.push_str(match line.pad_lines[i] {
PadLine::Parent => "| ",
PadLine::Ancestor => ". ",
PadLine::Blank => " ",
});
}
}
if let Some(msg) = message_lines.next() {
term_line.push_str(" ");
term_line.push_str(msg);
}
out.push_str(term_line.trim_end());
out.push_str("\n");
}
need_extra_pad_line = true;
}
let mut base_pad_line = String::new();
for (i, entry) in line.pad_lines.iter().enumerate() {
base_pad_line.push_str(match entry {
PadLine::Parent => {
if i > 0 {
" | "
} else {
"| "
}
}
PadLine::Ancestor => {
if i > 0 {
" . "
} else {
". "
}
}
PadLine::Blank => {
if i > 0 {
" "
} else {
" "
}
}
});
}
// Render any pad lines
for msg in message_lines {
let mut pad_line = base_pad_line.clone();
pad_line.push_str(" ");
pad_line.push_str(msg);
out.push_str(pad_line.trim_end());
out.push_str("\n");
need_extra_pad_line = false;
}
if need_extra_pad_line {
self.extra_pad_line = Some(base_pad_line);
}
out
}