use super::{maybe_span_column::MaybeSpanColumn, span_column::SpanColumn, width::Width};
pub enum Column<'t> {
Column {
column: MaybeSpanColumn<'t>,
width: Width,
},
None,
}
macro_rules! column_width {
($func_name:ident, $width:expr) => {
pub fn $func_name(column: MaybeSpanColumn<'t>) -> Column<'t> {
Column::new(column, $width)
}
};
}
impl<'t> Column<'t> {
pub fn new(column: MaybeSpanColumn<'t>, width: Width) -> Self {
match &column {
MaybeSpanColumn::Span(span_column) => {
if span_column.done() {
Self::None
} else {
Self::Column { column, width }
}
}
MaybeSpanColumn::Empty => Self::Column { column, width },
}
}
column_width!(third, Width::Third);
column_width!(half, Width::Half);
column_width!(two_thirds, Width::TwoThirds);
column_width!(one, Width::One);
pub fn done(&self) -> bool {
matches!(self, Self::None)
}
pub fn get_span_column(&self) -> Option<&&'t mut SpanColumn> {
match self {
Self::None => None,
Self::Column { column, width: _ } => match column {
MaybeSpanColumn::Span(column) => Some(column),
MaybeSpanColumn::Empty => None,
},
}
}
}
#[cfg(test)]
mod tests {
use super::Column;
use crate::font::language::Language;
use crate::{
font::cosmic_font::CosmicFont,
span::Span,
table::{maybe_span_column::MaybeSpanColumn, span_column::SpanColumn, width::Width},
};
#[test]
fn test_column() {
const MD: &str = "There are so many words in this sentence!";
let column = Column::None;
assert!(column.done());
let empty = MaybeSpanColumn::Empty;
let column = Column::new(empty, Width::Half);
assert!(!column.done());
let span = Span::from_md(MD).unwrap();
let mut span_column = SpanColumn::new(
span,
CosmicFont::default_left(),
"\\font",
Language::English,
);
span_column.start = 3;
let full = MaybeSpanColumn::Span(&mut span_column);
let column = Column::new(full, Width::Half);
assert!(!column.done());
let span = Span::from_md(MD).unwrap();
let len = span.0.len();
let mut span_column = SpanColumn::new(
span,
CosmicFont::default_left(),
"\\font",
Language::English,
);
span_column.start = len;
let full = MaybeSpanColumn::Span(&mut span_column);
let column = Column::new(full, Width::Half);
assert!(column.done());
}
}