rusticity-term 0.1.6

Terminal UI components for Rusticity
Documentation
use crate::common::{translate_column, ColumnId};
use crate::ui::table::Column as TableColumn;

#[derive(Debug, Clone, Copy, PartialEq)]
pub enum TagColumn {
    Key,
    Value,
}

impl TagColumn {
    const ID_KEY: &'static str = "column.cw.tag.key";
    const ID_VALUE: &'static str = "column.cw.tag.value";

    pub const fn id(&self) -> ColumnId {
        match self {
            TagColumn::Key => Self::ID_KEY,
            TagColumn::Value => Self::ID_VALUE,
        }
    }

    pub const fn default_name(&self) -> &'static str {
        match self {
            TagColumn::Key => "Key",
            TagColumn::Value => "Value",
        }
    }

    pub fn name(&self) -> String {
        translate_column(self.id(), self.default_name())
    }

    pub fn from_id(id: &str) -> Option<Self> {
        match id {
            Self::ID_KEY => Some(TagColumn::Key),
            Self::ID_VALUE => Some(TagColumn::Value),
            _ => None,
        }
    }

    pub const fn all() -> [TagColumn; 2] {
        [TagColumn::Key, TagColumn::Value]
    }

    pub fn ids() -> Vec<ColumnId> {
        Self::all().iter().map(|c| c.id()).collect()
    }
}

impl TableColumn<(String, String)> for TagColumn {
    fn name(&self) -> &str {
        Box::leak(translate_column(self.id(), self.default_name()).into_boxed_str())
    }

    fn width(&self) -> u16 {
        let translated = translate_column(self.id(), self.default_name());
        translated.len().max(20) as u16
    }

    fn render(&self, item: &(String, String)) -> (String, ratatui::style::Style) {
        let text = match self {
            TagColumn::Key => item.0.clone(),
            TagColumn::Value => item.1.clone(),
        };
        (text, ratatui::style::Style::default())
    }
}