use ansi_term::Style; use crate::fs::File; use crate::info::filetype::FileExtensions; use lazy_static::lazy_static; use std::collections::HashMap; pub trait FileIcon { fn icon_file(&self, file: &File<'_>) -> Option; } #[derive(Copy, Clone)] pub enum Icons { Audio, Image, Video, } impl Icons { pub fn value(self) -> char { match self { Self::Audio => '\u{f001}', Self::Image => '\u{f1c5}', Self::Video => '\u{f03d}', } } } /// Converts the style used to paint a file name into the style that should be /// used to paint an icon. /// /// - The background colour should be preferred to the foreground colour, as /// if one is set, it’s the more “obvious” colour choice. /// - If neither is set, just use the default style. /// - Attributes such as bold or underline should not be used to paint the /// icon, as they can make it look weird. pub fn iconify_style(style: Style) -> Style { style.background.or(style.foreground) .map(Style::from) .unwrap_or_default() } lazy_static! { static ref MAP_BY_NAME: HashMap<&'static str, char> = { let mut m = HashMap::new(); m.insert(".Trash", '\u{f1f8}'); //  m.insert(".atom", '\u{e764}'); //  m.insert(".bashprofile", '\u{e615}'); //  m.insert(".bashrc", '\u{f489}'); //  m.insert(".git", '\u{f1d3}'); //  m.insert(".gitattributes", '\u{f1d3}'); //  m.insert(".gitconfig", '\u{f1d3}'); //  m.insert(".github", '\u{f408}'); //  m.insert(".gitignore", '\u{f1d3}'); //  m.insert(".gitmodules", '\u{f1d3}'); //  m.insert(".rvm", '\u{e21e}'); //  m.insert(".vimrc", '\u{e62b}'); //  m.insert(".vscode", '\u{e70c}'); //  m.insert(".zshrc", '\u{f489}'); //  m.insert("Cargo.lock", '\u{e7a8}'); //  m.insert("bin", '\u{e5fc}'); //  m.insert("config", '\u{e5fc}'); //  m.insert("docker-compose.yml", '\u{f308}'); //  m.insert("Dockerfile", '\u{f308}'); //  m.insert("ds_store", '\u{f179}'); //  m.insert("gitignore_global", '\u{f1d3}'); //  m.insert("go.mod", '\u{e626}'); //  m.insert("go.sum", '\u{e626}'); //  m.insert("gradle", '\u{e256}'); //  m.insert("gruntfile.coffee", '\u{e611}'); //  m.insert("gruntfile.js", '\u{e611}'); //  m.insert("gruntfile.ls", '\u{e611}'); //  m.insert("gulpfile.coffee", '\u{e610}'); //  m.insert("gulpfile.js", '\u{e610}'); //  m.insert("gulpfile.ls", '\u{e610}'); //  m.insert("hidden", '\u{f023}'); //  m.insert("include", '\u{e5fc}'); //  m.insert("lib", '\u{f121}'); //  m.insert("localized", '\u{f179}'); //  m.insert("Makefile", '\u{f489}'); //  m.insert("node_modules", '\u{e718}'); //  m.insert("npmignore", '\u{e71e}'); //  m.insert("PKGBUILD", '\u{f303}'); //  m.insert("rubydoc", '\u{e73b}'); //  m.insert("yarn.lock", '\u{e718}'); //  m }; } pub fn icon_for_file(file: &File<'_>) -> char { let extensions = Box::new(FileExtensions); if let Some(icon) = MAP_BY_NAME.get(file.name.as_str()) { *icon } else if file.points_to_directory() { match file.name.as_str() { "bin" => '\u{e5fc}', //  ".git" => '\u{f1d3}', //  ".idea" => '\u{e7b5}', //  _ => '\u{f115}' //  } } else if let Some(icon) = extensions.icon_file(file) { icon } else if let Some(ext) = file.ext.as_ref() { match ext.as_str() { "ai" => '\u{e7b4}', //  "android" => '\u{e70e}', //  "apk" => '\u{e70e}', //  "apple" => '\u{f179}', //  "avi" => '\u{f03d}', //  "avif" => '\u{f1c5}', //  "avro" => '\u{e60b}', //  "awk" => '\u{f489}', //  "bash" => '\u{f489}', //  "bash_history" => '\u{f489}', //  "bash_profile" => '\u{f489}', //  "bashrc" => '\u{f489}', //  "bat" => '\u{f17a}', //  "bats" => '\u{f489}', //  "bmp" => '\u{f1c5}', //  "bz" => '\u{f410}', //  "bz2" => '\u{f410}', //  "c" => '\u{e61e}', //  "c++" => '\u{e61d}', //  "cab" => '\u{e70f}', //  "cc" => '\u{e61d}', //  "cfg" => '\u{e615}', //  "class" => '\u{e256}', //  "clj" => '\u{e768}', //  "cljs" => '\u{e76a}', //  "cls" => '\u{f034}', //  "cmd" => '\u{e70f}', //  "coffee" => '\u{f0f4}', //  "conf" => '\u{e615}', //  "cp" => '\u{e61d}', //  "cpio" => '\u{f410}', //  "cpp" => '\u{e61d}', //  "cs" => '\u{f81a}', //  "csh" => '\u{f489}', //  "cshtml" => '\u{f1fa}', //  "csproj" => '\u{f81a}', //  "css" => '\u{e749}', //  "csv" => '\u{f1c3}', //  "csx" => '\u{f81a}', //  "cxx" => '\u{e61d}', //  "d" => '\u{e7af}', //  "dart" => '\u{e798}', //  "db" => '\u{f1c0}', //  "deb" => '\u{e77d}', //  "diff" => '\u{f440}', //  "djvu" => '\u{f02d}', //  "dll" => '\u{e70f}', //  "doc" => '\u{f1c2}', //  "docx" => '\u{f1c2}', //  "ds_store" => '\u{f179}', //  "DS_store" => '\u{f179}', //  "dump" => '\u{f1c0}', //  "ebook" => '\u{e28b}', //  "ebuild" => '\u{f30d}', //  "editorconfig" => '\u{e615}', //  "ejs" => '\u{e618}', //  "elm" => '\u{e62c}', //  "env" => '\u{f462}', //  "eot" => '\u{f031}', //  "epub" => '\u{e28a}', //  "erb" => '\u{e73b}', //  "erl" => '\u{e7b1}', //  "ex" => '\u{e62d}', //  "exe" => '\u{f17a}', //  "exs" => '\u{e62d}', //  "fish" => '\u{f489}', //  "flac" => '\u{f001}', //  "flv" => '\u{f03d}', //  "font" => '\u{f031}', //  "fs" => '\u{e7a7}', //  "fsi" => '\u{e7a7}', //  "fsx" => '\u{e7a7}', //  "gdoc" => '\u{f1c2}', //  "gem" => '\u{e21e}', //  "gemfile" => '\u{e21e}', //  "gemspec" => '\u{e21e}', //  "gform" => '\u{f298}', //  "gif" => '\u{f1c5}', //  "git" => '\u{f1d3}', //  "gitattributes" => '\u{f1d3}', //  "gitignore" => '\u{f1d3}', //  "gitmodules" => '\u{f1d3}', //  "go" => '\u{e626}', //  "gradle" => '\u{e256}', //  "groovy" => '\u{e775}', //  "gsheet" => '\u{f1c3}', //  "gslides" => '\u{f1c4}', //  "guardfile" => '\u{e21e}', //  "gz" => '\u{f410}', //  "h" => '\u{f0fd}', //  "hbs" => '\u{e60f}', //  "hpp" => '\u{f0fd}', //  "hs" => '\u{e777}', //  "htm" => '\u{f13b}', //  "html" => '\u{f13b}', //  "hxx" => '\u{f0fd}', //  "ico" => '\u{f1c5}', //  "image" => '\u{f1c5}', //  "img" => '\u{e271}', //  "iml" => '\u{e7b5}', //  "ini" => '\u{f17a}', //  "ipynb" => '\u{e606}', //  "iso" => '\u{e271}', //  "j2c" => '\u{f1c5}', //  "j2k" => '\u{f1c5}', //  "jad" => '\u{e256}', //  "jar" => '\u{e256}', //  "java" => '\u{e256}', //  "jfi" => '\u{f1c5}', //  "jfif" => '\u{f1c5}', //  "jif" => '\u{f1c5}', //  "jl" => '\u{e624}', //  "jmd" => '\u{f48a}', //  "jp2" => '\u{f1c5}', //  "jpe" => '\u{f1c5}', //  "jpeg" => '\u{f1c5}', //  "jpg" => '\u{f1c5}', //  "jpx" => '\u{f1c5}', //  "js" => '\u{e74e}', //  "json" => '\u{e60b}', //  "jsx" => '\u{e7ba}', //  "jxl" => '\u{f1c5}', //  "ksh" => '\u{f489}', //  "latex" => '\u{f034}', //  "less" => '\u{e758}', //  "lhs" => '\u{e777}', //  "license" => '\u{f718}', //  "localized" => '\u{f179}', //  "lock" => '\u{f023}', //  "log" => '\u{f18d}', //  "lua" => '\u{e620}', //  "lz" => '\u{f410}', //  "lz4" => '\u{f410}', //  "lzh" => '\u{f410}', //  "lzma" => '\u{f410}', //  "lzo" => '\u{f410}', //  "m" => '\u{e61e}', //  "mm" => '\u{e61d}', //  "m4a" => '\u{f001}', //  "markdown" => '\u{f48a}', //  "md" => '\u{f48a}', //  "mjs" => '\u{e74e}', //  "mk" => '\u{f489}', //  "mkd" => '\u{f48a}', //  "mkv" => '\u{f03d}', //  "mobi" => '\u{e28b}', //  "mov" => '\u{f03d}', //  "mp3" => '\u{f001}', //  "mp4" => '\u{f03d}', //  "msi" => '\u{e70f}', //  "mustache" => '\u{e60f}', //  "nix" => '\u{f313}', //  "node" => '\u{f898}', //  "npmignore" => '\u{e71e}', //  "odp" => '\u{f1c4}', //  "ods" => '\u{f1c3}', //  "odt" => '\u{f1c2}', //  "ogg" => '\u{f001}', //  "ogv" => '\u{f03d}', //  "otf" => '\u{f031}', //  "part" => '\u{f43a}', //  "patch" => '\u{f440}', //  "pdf" => '\u{f1c1}', //  "php" => '\u{e73d}', //  "pl" => '\u{e769}', //  "plx" => '\u{e769}', //  "pm" => '\u{e769}', //  "png" => '\u{f1c5}', //  "pod" => '\u{e769}', //  "ppt" => '\u{f1c4}', //  "pptx" => '\u{f1c4}', //  "procfile" => '\u{e21e}', //  "properties" => '\u{e60b}', //  "ps1" => '\u{f489}', //  "psd" => '\u{e7b8}', //  "pxm" => '\u{f1c5}', //  "py" => '\u{e606}', //  "pyc" => '\u{e606}', //  "r" => '\u{f25d}', //  "rakefile" => '\u{e21e}', //  "rar" => '\u{f410}', //  "razor" => '\u{f1fa}', //  "rb" => '\u{e21e}', //  "rdata" => '\u{f25d}', //  "rdb" => '\u{e76d}', //  "rdoc" => '\u{f48a}', //  "rds" => '\u{f25d}', //  "readme" => '\u{f48a}', //  "rlib" => '\u{e7a8}', //  "rmd" => '\u{f48a}', //  "rpm" => '\u{e7bb}', //  "rs" => '\u{e7a8}', //  "rspec" => '\u{e21e}', //  "rspec_parallel"=> '\u{e21e}', //  "rspec_status" => '\u{e21e}', //  "rss" => '\u{f09e}', //  "rtf" => '\u{f718}', //  "ru" => '\u{e21e}', //  "rubydoc" => '\u{e73b}', //  "sass" => '\u{e603}', //  "scala" => '\u{e737}', //  "scss" => '\u{e749}', //  "sh" => '\u{f489}', //  "shell" => '\u{f489}', //  "slim" => '\u{e73b}', //  "sln" => '\u{e70c}', //  "so" => '\u{f17c}', //  "sql" => '\u{f1c0}', //  "sqlite3" => '\u{e7c4}', //  "sty" => '\u{f034}', //  "styl" => '\u{e600}', //  "stylus" => '\u{e600}', //  "svg" => '\u{f1c5}', //  "swift" => '\u{e755}', //  "t" => '\u{e769}', //  "tar" => '\u{f410}', //  "taz" => '\u{f410}', //  "tbz" => '\u{f410}', //  "tbz2" => '\u{f410}', //  "tex" => '\u{f034}', //  "tgz" => '\u{f410}', //  "tiff" => '\u{f1c5}', //  "tlz" => '\u{f410}', //  "toml" => '\u{e615}', //  "torrent" => '\u{e275}', //  "ts" => '\u{e628}', //  "tsv" => '\u{f1c3}', //  "tsx" => '\u{e7ba}', //  "ttf" => '\u{f031}', //  "twig" => '\u{e61c}', //  "txt" => '\u{f15c}', //  "txz" => '\u{f410}', //  "tz" => '\u{f410}', //  "tzo" => '\u{f410}', //  "video" => '\u{f03d}', //  "vim" => '\u{e62b}', //  "vue" => '\u{fd42}', // ﵂ "war" => '\u{e256}', //  "wav" => '\u{f001}', //  "webm" => '\u{f03d}', //  "webp" => '\u{f1c5}', //  "windows" => '\u{f17a}', //  "woff" => '\u{f031}', //  "woff2" => '\u{f031}', //  "xhtml" => '\u{f13b}', //  "xls" => '\u{f1c3}', //  "xlsx" => '\u{f1c3}', //  "xml" => '\u{f121}', //  "xul" => '\u{f121}', //  "xz" => '\u{f410}', //  "yaml" => '\u{f481}', //  "yml" => '\u{f481}', //  "zip" => '\u{f410}', //  "zsh" => '\u{f489}', //  "zsh-theme" => '\u{f489}', //  "zshrc" => '\u{f489}', //  "zst" => '\u{f410}', //  _ => '\u{f15b}' //  } } else { '\u{f016}' } }