crabular 0.7.0

A high-performance ASCII table library for Rust
Documentation
use crate::Alignment;

#[derive(Clone)]
pub struct Cell {
    content: String,
    alignment: Alignment,
    span: usize,
}

impl Cell {
    #[must_use]
    pub fn new(content: &str, alignment: Alignment) -> Self {
        Self {
            content: content.to_string(),
            alignment,
            span: 1,
        }
    }

    #[must_use]
    pub fn content(&self) -> &str {
        &self.content
    }

    #[must_use]
    pub fn alignment(&self) -> Alignment {
        self.alignment
    }

    #[must_use]
    pub fn span(&self) -> usize {
        self.span
    }

    pub fn set_span(&mut self, span: usize) {
        self.span = span.max(1);
    }

    pub fn set_alignment(&mut self, alignment: Alignment) {
        self.alignment = alignment;
    }
}

impl core::fmt::Display for Cell {
    fn fmt(&self, f: &mut core::fmt::Formatter) -> core::fmt::Result {
        write!(f, "{}", self.content)
    }
}

#[cfg(test)]
mod tests {
    use crate::{Alignment, Cell};

    #[test]
    fn creation() {
        let cases = [
            ("hello", Alignment::Left),
            ("world", Alignment::Center),
            ("test", Alignment::Right),
            ("", Alignment::Left),
        ];
        for (content, alignment) in cases {
            let cell = Cell::new(content, alignment);
            assert_eq!(cell.content(), content);
            assert_eq!(cell.alignment(), alignment);
            assert_eq!(cell.span(), 1);
        }
    }

    #[test]
    fn set_span() {
        let cases = [1, 2, 3, 5, 10];
        for span in cases {
            let mut cell = Cell::new("test", Alignment::Left);
            cell.set_span(span);
            assert_eq!(cell.span(), span);
        }
    }

    #[test]
    fn set_alignment() {
        let mut cell = Cell::new("test", Alignment::Left);

        cell.set_alignment(Alignment::Right);
        assert_eq!(cell.alignment(), Alignment::Right);

        cell.set_alignment(Alignment::Center);
        assert_eq!(cell.alignment(), Alignment::Center);
    }

    #[test]
    fn clone_trait() {
        let cell = Cell::new("test", Alignment::Center);
        let cloned = cell.clone();
        assert_eq!(cell.content(), cloned.content());
        assert_eq!(cell.alignment(), cloned.alignment());
        assert_eq!(cell.span(), cloned.span());
    }

    #[test]
    fn span_preserved_on_clone() {
        let mut cell = Cell::new("test", Alignment::Left);
        cell.set_span(3);
        let cloned = cell.clone();
        assert_eq!(cloned.span(), 3);
    }

    #[test]
    fn display_trait_content() {
        let cell = Cell::new("hello world", Alignment::Left);
        let displayed = format!("{cell}");
        assert_eq!(displayed, "hello world");
    }

    #[test]
    fn display_trait_empty() {
        let cell = Cell::new("", Alignment::Center);
        let displayed = format!("{cell}");
        assert_eq!(displayed, "");
    }

    #[test]
    fn display_trait_unicode() {
        let cell = Cell::new("日本語", Alignment::Right);
        let displayed = format!("{cell}");
        assert_eq!(displayed, "日本語");
    }
}