in eden/scm/lib/dag/src/render/box_drawing.rs [127:293]
fn next_row(
&mut self,
node: N,
parents: Vec<Ancestor<N>>,
glyph: String,
message: String,
) -> String {
let glyphs = self.glyphs;
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 entry in line.node_line.iter() {
match entry {
NodeLine::Node => {
node_line.push_str(&line.glyph);
node_line.push_str(" ");
}
NodeLine::Parent => node_line.push_str(glyphs[glyph::PARENT]),
NodeLine::Ancestor => node_line.push_str(glyphs[glyph::ANCESTOR]),
NodeLine::Blank => node_line.push_str(glyphs[glyph::SPACE]),
}
}
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
#[allow(clippy::if_same_then_else)]
if let Some(link_row) = line.link_line {
let mut link_line = String::new();
for cur in link_row.iter() {
if cur.contains(LinkLine::HORIZONTAL) {
if cur.intersects(LinkLine::CHILD) {
link_line.push_str(glyphs[glyph::JOIN_BOTH]);
} else if cur.intersects(LinkLine::ANY_FORK)
&& cur.intersects(LinkLine::ANY_MERGE)
{
link_line.push_str(glyphs[glyph::JOIN_BOTH]);
} else if cur.intersects(LinkLine::ANY_FORK)
&& cur.intersects(LinkLine::PARENT)
&& !line.merge
{
link_line.push_str(glyphs[glyph::JOIN_BOTH]);
} else if cur.intersects(LinkLine::ANY_FORK) {
link_line.push_str(glyphs[glyph::FORK_BOTH]);
} else if cur.intersects(LinkLine::ANY_MERGE) {
link_line.push_str(glyphs[glyph::MERGE_BOTH]);
} else {
link_line.push_str(glyphs[glyph::HORIZONTAL]);
}
} else if cur.contains(LinkLine::PARENT) && !line.merge {
let left = cur.intersects(LinkLine::LEFT_MERGE | LinkLine::LEFT_FORK);
let right = cur.intersects(LinkLine::RIGHT_MERGE | LinkLine::RIGHT_FORK);
match (left, right) {
(true, true) => link_line.push_str(glyphs[glyph::JOIN_BOTH]),
(true, false) => link_line.push_str(glyphs[glyph::JOIN_LEFT]),
(false, true) => link_line.push_str(glyphs[glyph::JOIN_RIGHT]),
(false, false) => link_line.push_str(glyphs[glyph::PARENT]),
}
} else if cur.intersects(LinkLine::PARENT | LinkLine::ANCESTOR)
&& !cur.intersects(LinkLine::LEFT_FORK | LinkLine::RIGHT_FORK)
{
let left = cur.contains(LinkLine::LEFT_MERGE);
let right = cur.contains(LinkLine::RIGHT_MERGE);
match (left, right) {
(true, true) => link_line.push_str(glyphs[glyph::JOIN_BOTH]),
(true, false) => link_line.push_str(glyphs[glyph::JOIN_LEFT]),
(false, true) => link_line.push_str(glyphs[glyph::JOIN_RIGHT]),
(false, false) => {
if cur.contains(LinkLine::ANCESTOR) {
link_line.push_str(glyphs[glyph::ANCESTOR]);
} else {
link_line.push_str(glyphs[glyph::PARENT]);
}
}
}
} else if cur.contains(LinkLine::LEFT_FORK)
&& cur.intersects(LinkLine::LEFT_MERGE | LinkLine::CHILD)
{
link_line.push_str(glyphs[glyph::JOIN_LEFT]);
} else if cur.contains(LinkLine::RIGHT_FORK)
&& cur.intersects(LinkLine::RIGHT_MERGE | LinkLine::CHILD)
{
link_line.push_str(glyphs[glyph::JOIN_RIGHT]);
} else if cur.contains(LinkLine::ANY_MERGE) {
link_line.push_str(glyphs[glyph::MERGE_BOTH]);
} else if cur.contains(LinkLine::ANY_FORK) {
link_line.push_str(glyphs[glyph::FORK_BOTH]);
} else if cur.contains(LinkLine::LEFT_FORK) {
link_line.push_str(glyphs[glyph::FORK_LEFT]);
} else if cur.contains(LinkLine::LEFT_MERGE) {
link_line.push_str(glyphs[glyph::MERGE_LEFT]);
} else if cur.contains(LinkLine::RIGHT_FORK) {
link_line.push_str(glyphs[glyph::FORK_RIGHT]);
} else if cur.contains(LinkLine::RIGHT_MERGE) {
link_line.push_str(glyphs[glyph::MERGE_RIGHT]);
} else {
link_line.push_str(glyphs[glyph::SPACE]);
}
}
if let Some(msg) = message_lines.next() {
link_line.push_str(" ");
link_line.push_str(msg);
}
out.push_str(link_line.trim_end());
out.push_str("\n");
}
// Render the term line
if let Some(term_row) = line.term_line {
let term_strs = [glyphs[glyph::PARENT], glyphs[glyph::TERMINATION]];
for term_str in term_strs.iter() {
let mut term_line = String::new();
for (i, term) in term_row.iter().enumerate() {
if *term {
term_line.push_str(term_str);
} else {
term_line.push_str(glyphs[line.pad_lines[i].to_glyph()]);
}
}
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 entry in line.pad_lines.iter() {
base_pad_line.push_str(glyphs[entry.to_glyph()]);
}
// 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
}