rusticity-term 0.1.6

Terminal UI components for Rusticity
Documentation
use crate::ui::table::Column as TableColumn;
use crate::ui::tree::TreeItem;
use ratatui::prelude::*;
pub use rusticity_core::apig::Resource;

impl TreeItem for Resource {
    fn id(&self) -> &str {
        &self.id
    }

    fn display_name(&self) -> &str {
        &self.display_name
    }

    fn is_expandable(&self) -> bool {
        !self.methods.is_empty()
    }

    fn icon(&self) -> &str {
        ""
    }
}

#[derive(Debug, Clone, Copy, PartialEq)]
pub enum Column {
    Path,
    Id,
    Arn,
}

impl Column {
    const ID_PATH: &'static str = "path";
    const ID_ID: &'static str = "id";
    const ID_ARN: &'static str = "arn";

    pub const fn id(&self) -> &'static str {
        match self {
            Column::Path => Self::ID_PATH,
            Column::Id => Self::ID_ID,
            Column::Arn => Self::ID_ARN,
        }
    }

    pub fn from_id(id: &str) -> Option<Self> {
        match id {
            Self::ID_PATH => Some(Column::Path),
            Self::ID_ID => Some(Column::Id),
            Self::ID_ARN => Some(Column::Arn),
            _ => None,
        }
    }

    pub const fn all() -> [Column; 3] {
        [Column::Path, Column::Id, Column::Arn]
    }

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

impl TableColumn<Resource> for Column {
    fn name(&self) -> &str {
        match self {
            Column::Path => "Resource",
            Column::Id => "ID",
            Column::Arn => "ARN",
        }
    }

    fn width(&self) -> u16 {
        match self {
            Column::Path => 40,
            Column::Id => 20,
            Column::Arn => 60,
        }
    }

    fn render(&self, item: &Resource) -> (String, Style) {
        let text = match self {
            Column::Path => item.path.clone(),
            Column::Id => item.id.clone(),
            Column::Arn => item.arn.clone(),
        };
        (text, Style::default())
    }
}