use crate::Line; pub struct Table { pub columns: Vec, pub rows: Vec>, } pub struct Column { pub name: Line, pub alignment: Alignment, } pub enum Alignment { Left, Center, Right, } impl Alignment { pub fn from_str(s: &str) -> Result { let mut start = false; let mut end = false; for (i, c) in s.chars().enumerate() { if c == ':' { if i == 0 { start = true; } else if i == s.len() - 1 { end = true; } else { return Err(()); } } else if c != '-' { return Err(()); } } Ok(match (start, end) { (false, false) => Self::Left, (true, false) => Self::Left, (false, true) => Self::Right, (true, true) => Self::Center, }) } } impl std::fmt::Display for Alignment { fn fmt(&self, f: &mut std::fmt::Formatter) -> Result<(), std::fmt::Error> { f.write_str(match self { Self::Left => "left", Self::Center => "center", Self::Right => "right", }) } } impl std::fmt::Debug for Alignment { fn fmt(&self, f: &mut std::fmt::Formatter) -> Result<(), std::fmt::Error> { f.write_str(match self { Self::Left => "Left", Self::Center => "Center", Self::Right => "Right", }) } }