use super::Node;
#[derive(Debug, Clone)]
pub struct TableBuilder {
headers: Vec<Node>,
rows: Vec<Vec<Node>>,
#[cfg(feature = "gfm")]
alignments: Vec<super::TableAlignment>,
}
impl TableBuilder {
pub fn new() -> Self {
Self {
headers: Vec::new(),
rows: Vec::new(),
#[cfg(feature = "gfm")]
alignments: Vec::new(),
}
}
pub fn headers(mut self, headers: Vec<Node>) -> Self {
self.headers = headers;
self
}
pub fn add_row(mut self, row: Vec<Node>) -> Self {
self.rows.push(row);
self
}
pub fn add_rows(mut self, rows: Vec<Vec<Node>>) -> Self {
self.rows.extend(rows);
self
}
#[cfg(not(feature = "gfm"))]
pub fn build(self) -> Node {
Node::Table {
headers: self.headers,
rows: self.rows,
}
}
#[cfg(feature = "gfm")]
pub fn build(self) -> Node {
Node::Table {
headers: self.headers,
alignments: self.alignments,
rows: self.rows,
}
}
#[cfg(feature = "gfm")]
pub fn align_all(mut self, alignment: super::TableAlignment) -> Self {
self.alignments = vec![alignment; self.headers.len().max(1)];
self
}
#[cfg(feature = "gfm")]
pub fn align_column(mut self, column: usize, alignment: super::TableAlignment) -> Self {
if column >= self.alignments.len() {
self.alignments
.resize(column + 1, super::TableAlignment::default());
}
self.alignments[column] = alignment;
self
}
#[cfg(feature = "gfm")]
pub fn alignments(mut self, alignments: Vec<super::TableAlignment>) -> Self {
self.alignments = alignments;
self
}
}
impl Default for TableBuilder {
fn default() -> Self {
Self::new()
}
}
pub fn simple_table(headers: Vec<Node>, rows: Vec<Vec<Node>>) -> Node {
TableBuilder::new().headers(headers).add_rows(rows).build()
}
#[cfg(feature = "gfm")]
pub fn centered_table(headers: Vec<Node>, rows: Vec<Vec<Node>>) -> Node {
TableBuilder::new()
.headers(headers)
.align_all(super::TableAlignment::Center)
.add_rows(rows)
.build()
}