utf-railroad 1.1.0

Generate text railroad diagrams in rust.
Documentation
use std::fmt;
use crate::{Node, Sequence};

pub struct Diagram(Sequence);

impl Diagram {
    pub fn new() -> Self {
        Self::default()
    }

    pub fn push(self, node: Box<dyn Node>) -> Self {
        Self(self.0.push(node))
    }

    pub fn gap_size(self, size: usize) -> Self {
        Self(self.0.gap_size(size))
    }

    pub fn next_row(self) -> Self {
        Self(self.0.next_row())
    }

    pub fn num_rows(&self) -> usize {
        self.0.num_rows()
    }
}

impl Default for Diagram {
    fn default() -> Self {
        Self(Sequence::default())
    }
}

impl Node for Diagram {
    fn get_width(&self) -> usize {
        self.0.get_width() + self.0.gap_size * 2 + 2
    }

    fn get_height(&self) -> usize {
        self.0.get_height()
    }

    fn as_str(&self) -> String {
        let mut ret = String::new();

        let s = self.0.as_str();
        let lines = s.lines().collect::<Vec<_>>();
        for y in 0..lines.len() {
            if y == 1 {
                ret += "";
                for _ in 0..self.0.gap_size { ret += ""; }
            } else {
                ret += " ";
                for _ in 0..self.0.gap_size { ret += " "; }
            }

            ret += lines[y];

            if y == 1 {
                for _ in 0..self.0.gap_size { ret += ""; }
                ret += "";
            } else {
                for _ in 0..self.0.gap_size { ret += " "; }
                ret += " ";
            }

            if y < lines.len() - 1 { ret += "\n" }
        }

        ret
    }
}

impl fmt::Display for Diagram {
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
        write!(f, "{}", self.as_str())
    }
}