tabiew 0.15.1

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

use crate::misc::config::config;

#[derive(Debug, Clone, Copy)]
pub struct Icon(&'static str);

impl Icon {
    pub fn str(self, fallback: &'static str) -> &'static str {
        if config().use_nerd_font() {
            self.0
        } else {
            fallback
        }
    }

    pub fn title(self, text: impl Display) -> String {
        if config().use_nerd_font() {
            format!("{} {text}", self.0)
        } else {
            text.to_string()
        }
    }

    pub fn item(self, text: impl Display) -> String {
        if config().use_nerd_font() {
            format!(" {} {text}", self.0)
        } else {
            text.to_string()
        }
    }
}

pub const FILE: Icon = Icon("\u{F15B} ");
pub const FORMAT: Icon = Icon("\u{F016} ");
pub const FOLDER: Icon = Icon("\u{F07B} ");
pub const FOLDER_OPEN: Icon = Icon("\u{F07C} ");
pub const TABLE: Icon = Icon("\u{F0CE} ");
pub const JSON: Icon = Icon("\u{E60B} ");
pub const DATABASE: Icon = Icon("\u{F1C0} ");
pub const EXCEL: Icon = Icon("\u{F1C3} ");
pub const HTML: Icon = Icon("\u{F121} ");
pub const MARKDOWN: Icon = Icon("\u{EB1D} ");
pub const TEXT: Icon = Icon("\u{F0F6} ");
pub const TERMINAL: Icon = Icon("\u{F120} ");
pub const GLOBE: Icon = Icon("\u{F0AC} ");
pub const GITHUB: Icon = Icon("\u{F09B} ");
pub const BOOK: Icon = Icon("\u{F02D} ");
pub const CHECK: Icon = Icon("\u{F00C} ");
pub const CROSS: Icon = Icon("\u{F00D}");
pub const IMPORT: Icon = Icon("\u{F090} ");
pub const EXPORT: Icon = Icon("\u{F08B} ");
pub const CLIPBOARD: Icon = Icon("\u{F0EA} ");
pub const HEADER: Icon = Icon("\u{F1DC} ");
pub const SEPARATOR: Icon = Icon("\u{F142} ");
pub const QUOTE: Icon = Icon("\u{F10D} ");
pub const LOCK: Icon = Icon("\u{F023} ");
pub const WIDTH: Icon = Icon("\u{F07E} ");
pub const EXPAND: Icon = Icon("\u{F0B2} ");
pub const HEIGHT: Icon = Icon("\u{F07D}");
pub const SEARCH: Icon = Icon("\u{F002} ");
pub const FUZZY_SEARCH: Icon = Icon("\u{ED23} ");
pub const FILTER: Icon = Icon("\u{F0B0} ");
pub const SORT: Icon = Icon("\u{F0DC} ");
pub const COLUMN: Icon = Icon("\u{F0DB} ");
pub const CAST: Icon = Icon("\u{F0EC} ");
pub const CHART: Icon = Icon("\u{F080} ");
pub const SCATTER: Icon = Icon("\u{F192} ");
pub const TAG: Icon = Icon("\u{F02B} ");
pub const PRECISION: Icon = Icon("\u{F1EC} ");
pub const PALETTE: Icon = Icon("\u{F1FC} ");
pub const PENCIL: Icon = Icon("\u{F040} ");
pub const REFRESH: Icon = Icon("\u{F021} ");
pub const POWER: Icon = Icon("\u{F011} ");
pub const SCHEMA: Icon = Icon("\u{F0E8} ");
pub const INFO: Icon = Icon("\u{F05A} ");
pub const FONT: Icon = Icon("\u{F031} ");
pub const ROW_NUMBERS: Icon = Icon("\u{F0CB} ");
pub const BORDERS: Icon = Icon("\u{F096} ");
pub const GRID: Icon = Icon("\u{F00A} ");
pub const ELLIPSIS: Icon = Icon("\u{F141} ");
pub const ARROW_UP: Icon = Icon("\u{F062} ");
pub const ARROW_DOWN: Icon = Icon("\u{F063} ");
pub const COPY: Icon = Icon("\u{F0C5} ");
pub const TRASH: Icon = Icon("\u{F1F8} ");
pub const WEDGE: Icon = Icon("\u{E0B0}");
pub const TAB: Icon = Icon("\u{F04E9} ");
pub const SHIFT: Icon = Icon("\u{F0636} ");
pub const BACKSPACE: Icon = Icon("\u{EE23} ");

pub fn extension(ext: Option<&str>) -> Icon {
    match ext {
        Some("csv" | "tsv") => TABLE,
        Some("json" | "jsonl") => JSON,
        Some("parquet" | "pqt" | "arrow" | "avro" | "db" | "sqlite") => DATABASE,
        Some("xls" | "xlsx" | "xlsm" | "xlsb") => EXCEL,
        Some("html" | "htm") => HTML,
        Some("md" | "markdown") => MARKDOWN,
        Some("fwf" | "log" | "logfmt" | "txt") => TEXT,
        _ => FILE,
    }
}