use crate::*;
#[derive(Debug, Clone)]
pub struct CellDef {
pub md: String,
pub align: Alignment,
}
#[derive(Debug, Clone)]
pub struct Col {
pub header: CellDef,
pub content: CellDef,
}
#[derive(Debug, Clone, Default)]
pub struct TableBuilder {
pub cols: Vec<Col>,
pub rows_sub_name: Option<String>,
}
impl CellDef {
pub fn new<S: Into<String>>(md: S) -> Self {
Self {
md: md.into(),
align: Alignment::Unspecified,
}
}
pub fn align(
mut self,
align: Alignment,
) -> Self {
self.align = align;
self
}
}
impl Col {
pub fn simple<S: AsRef<str>>(var_name: S) -> Self {
Self::new(
var_name.as_ref().to_string(),
format!("${{{}}}", var_name.as_ref().replace(' ', "-")),
)
}
pub fn new<H: Into<String>, C: Into<String>>(
header_md: H,
content_md: C,
) -> Self {
Self {
header: CellDef::new(header_md).align(Alignment::Center),
content: CellDef::new(content_md),
}
}
pub fn align(
mut self,
align: Alignment,
) -> Self {
self.header.align = align;
self.content.align = align;
self
}
pub fn align_header(
mut self,
align: Alignment,
) -> Self {
self.header.align = align;
self
}
pub fn align_content(
mut self,
align: Alignment,
) -> Self {
self.content.align = align;
self
}
}
impl TableBuilder {
pub fn col(
&mut self,
col: Col,
) -> &mut Self {
self.cols.push(col);
self
}
pub fn template_md(&self) -> String {
let mut md = String::new();
for col in &self.cols {
md.push_str(col.header.align.col_spec());
}
md.push('\n');
for col in &self.cols {
md.push('|');
md.push_str(&col.header.md);
}
md.push('\n');
for col in &self.cols {
md.push_str(col.content.align.col_spec());
}
md.push_str("\n${");
if let Some(name) = self.rows_sub_name.as_ref() {
md.push_str(name);
} else {
md.push_str("rows");
}
md.push('\n');
for col in &self.cols {
md.push('|');
md.push_str(&col.content.md);
}
md.push_str("\n}\n|-\n");
md
}
}
impl From<&TableBuilder> for String {
fn from(tblbl: &TableBuilder) -> String {
tblbl.template_md()
}
}