dracon-terminal-engine 1.1.17

A next-generation terminal compositor engine for Rust. Z-indexed layers, TrueColor, SGR mouse, Kitty keyboard, and drop-in Ratatui support.
Documentation
use crate::utils::{FileCategory, IconMode};
use serde::{Deserialize, Serialize};

#[derive(Clone, Copy, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub enum Icon {
    Folder,
    File,
    Star,
    Storage,
    Remote,
    Git,
    Archive,
    Image,
    Audio,
    Video,
    Script,
    Document,
    Search,
    Split,
    Single,
    Back,
    Forward,
    Burger,
    Refresh,
    Monitor,
    Settings,
    Trash,
    Home,
    Downloads,
    Documents,
    Pictures,
    Music,
    Videos,
    Rust,
    Json,
    Toml,
    Markdown,
    SelectAll,
    ToggleHidden,
    SetWallpaper,
    Paste,
    Cut,
    Copy,
    Duplicate,
    Delete,
    Rename,
}

impl Icon {
    pub fn get_for_path(
        path: &std::path::Path,
        category: FileCategory,
        is_dir: bool,
        icon_mode: IconMode,
    ) -> &'static str {
        if is_dir {
            let name = path
                .file_name()
                .and_then(|n| n.to_str())
                .unwrap_or("")
                .to_lowercase();
            let icon = match name.as_str() {
                "home" => Icon::Home,
                "downloads" => Icon::Downloads,
                "documents" => Icon::Documents,
                "pictures" => Icon::Pictures,
                "music" => Icon::Music,
                "videos" => Icon::Videos,
                "desktop" => Icon::Monitor,
                ".local" | ".config" | ".cache" => Icon::Settings,
                ".trash" | "trash" => Icon::Trash,
                _ => Icon::Folder,
            };
            return icon.get(icon_mode);
        }

        let ext = path
            .extension()
            .and_then(|e| e.to_str())
            .unwrap_or("")
            .to_lowercase();
        let icon = match ext.as_str() {
            "rs" => Icon::Rust,
            "json" => Icon::Json,
            "toml" => Icon::Toml,
            "md" => Icon::Markdown,
            "sh" | "bash" | "py" | "js" | "ts" => Icon::Script,
            _ => match category {
                FileCategory::Archive => Icon::Archive,
                FileCategory::Image => Icon::Image,
                FileCategory::Audio => Icon::Audio,
                FileCategory::Video => Icon::Videos,
                FileCategory::Script => Icon::Script,
                FileCategory::Document => Icon::Document,
                _ => Icon::File,
            },
        };
        icon.get(icon_mode)
    }

    pub fn get(&self, mode: IconMode) -> &'static str {
        match mode {
            IconMode::Nerd => match self {
                Icon::Folder => "󰉋 ",
                Icon::File => "󰈔 ",
                Icon::Star => "󰓎 ",
                Icon::Storage => "󰋊 ",
                Icon::Remote => "󰒍 ",
                Icon::Git => "󰊢 ",
                Icon::Archive => "󰛫 ",
                Icon::Image => "󰸉 ",
                Icon::Audio => "󰝚 ",
                Icon::Video => "󰐊 ",
                Icon::Script => "󰞷 ",
                Icon::Document => "󰈙 ",
                Icon::Search => "󰍉 ",
                Icon::Split => "󰙀 ",
                Icon::Single => "󰇄 ",
                Icon::Back => "󰁍 ",
                Icon::Forward => "󰁔 ",
                Icon::Burger => "󰍜 ",
                Icon::Refresh => "󰑓 ",
                Icon::Monitor => "󰐠 ",
                Icon::Settings => "󰒓 ",
                Icon::Trash => "󰆴 ",
                Icon::Home => "󰋜 ",
                Icon::Downloads => "󰇚 ",
                Icon::Documents => "󰈙 ",
                Icon::Pictures => "󰸉 ",
                Icon::Music => "󰝚 ",
                Icon::Videos => "󰐊 ",
                Icon::Rust => "󱘗 ",
                Icon::Json => "󬭦 ",
                Icon::Toml => "󱘗 ",
                Icon::Markdown => "󰍔 ",
                Icon::SelectAll => "󰒆 ",
                Icon::ToggleHidden => "󰈈 ",
                Icon::SetWallpaper => "󰸉 ",
                Icon::Paste => "󰆒 ",
                Icon::Cut => "󰆐 ",
                Icon::Copy => "󰆏 ",
                Icon::Duplicate => "󰆏 ",
                Icon::Delete => "󰆴 ",
                Icon::Rename => "󰏫 ",
            },
            IconMode::Unicode => match self {
                Icon::Folder => "",
                Icon::File => "",
                Icon::Star => "",
                Icon::Storage => "",
                Icon::Remote => "",
                Icon::Git => "± ",
                Icon::Archive => "",
                Icon::Image => "画像 ",
                Icon::Audio => "",
                Icon::Video => "",
                Icon::Script => "$ ",
                Icon::Document => "",
                Icon::Search => "🔍 ",
                Icon::Split => "|| ",
                Icon::Single => "[] ",
                Icon::Back => "",
                Icon::Forward => "",
                Icon::Burger => "",
                Icon::Refresh => "",
                Icon::Monitor => "📈 ",
                Icon::Settings => "",
                Icon::Trash => "",
                Icon::Home => "",
                Icon::Downloads => "",
                Icon::Documents => "",
                Icon::Pictures => "",
                Icon::Music => "",
                Icon::Videos => "",
                Icon::Rust => "R ",
                Icon::Json => "{ ",
                Icon::Toml => "T ",
                Icon::Markdown => "M ",
                Icon::SelectAll => "",
                Icon::ToggleHidden => "👁 ",
                Icon::SetWallpaper => "🖼 ",
                Icon::Paste => "📋 ",
                Icon::Cut => "",
                Icon::Copy => "",
                Icon::Duplicate => "",
                Icon::Delete => "",
                Icon::Rename => "",
            },
            IconMode::ASCII => match self {
                Icon::Folder => "[D] ",
                Icon::File => "[F] ",
                Icon::Star => "[*] ",
                Icon::Storage => "[S] ",
                Icon::Remote => "[R] ",
                Icon::Git => "[G] ",
                Icon::Archive => "[Z] ",
                Icon::Image => "[I] ",
                Icon::Audio => "[A] ",
                Icon::Video => "[V] ",
                Icon::Script => "[X] ",
                Icon::Document => "[T] ",
                Icon::Search => "/ ",
                Icon::Split => "[S] ",
                Icon::Single => "[1] ",
                Icon::Back => "< ",
                Icon::Forward => "> ",
                Icon::Burger => "[=] ",
                Icon::Refresh => "[R] ",
                Icon::Monitor => "[M] ",
                Icon::Settings => "[S] ",
                Icon::Trash => "[X] ",
                Icon::Home => "[H] ",
                Icon::Downloads => "[v] ",
                Icon::Documents => "[D] ",
                Icon::Pictures => "[P] ",
                Icon::Music => "[M] ",
                Icon::Videos => "[V] ",
                Icon::Rust => "[R] ",
                Icon::Json => "[J] ",
                Icon::Toml => "[T] ",
                Icon::Markdown => "[M] ",
                Icon::SelectAll => "[A] ",
                Icon::ToggleHidden => "[H] ",
                Icon::SetWallpaper => "[W] ",
                Icon::Paste => "[P] ",
                Icon::Cut => "[X] ",
                Icon::Copy => "[C] ",
                Icon::Duplicate => "[D] ",
                Icon::Delete => "[D] ",
                Icon::Rename => "[R] ",
            },
        }
    }
}