fn next_row()

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
    }