tabiew 0.16.0

A lightweight TUI application to view and query tabular data files, such as CSV, TSV, and parquet.
use std::fmt::Display;

use strum::IntoEnumIterator;
use strum_macros::{EnumIter, IntoStaticStr};

use crate::{
    readers::ReaderSource,
    tui::{component::Component, icons, popups::pickers::list_picker::ListPicker},
};

#[derive(Debug)]
pub struct ImportSourcePicker {
    list_picker: ListPicker<SourceType>,
}

impl ImportSourcePicker {
    pub fn value(&self) -> Option<&SourceType> {
        self.list_picker.selected_item()
    }
}

impl Component for ImportSourcePicker {
    fn render(
        &mut self,
        area: ratatui::prelude::Rect,
        buf: &mut ratatui::prelude::Buffer,
        focus_state: crate::tui::component::FocusState,
    ) {
        self.list_picker.render(area, buf, focus_state);
    }

    fn handle(&mut self, event: crossterm::event::KeyEvent) -> bool {
        self.list_picker.handle(event)
    }
}

impl Default for ImportSourcePicker {
    fn default() -> Self {
        Self {
            list_picker: ListPicker::new(SourceType::iter().collect())
                .with_title(icons::IMPORT.title("Import Source")),
        }
    }
}

#[derive(Debug, Clone, Copy, PartialEq, Eq, IntoStaticStr, EnumIter)]
pub enum SourceType {
    File,
    Stdin,
    Url,
}

impl SourceType {
    fn icon(&self) -> icons::Icon {
        match self {
            SourceType::File => icons::FILE,
            SourceType::Stdin => icons::TERMINAL,
            SourceType::Url => icons::GLOBE,
        }
    }
}

impl Display for SourceType {
    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
        write!(f, "{}", self.icon().item(Into::<&str>::into(self)))
    }
}

impl From<&ReaderSource> for SourceType {
    fn from(r: &ReaderSource) -> Self {
        match r {
            ReaderSource::Stdin => SourceType::Stdin,
            ReaderSource::File(_) => SourceType::File,
        }
    }
}