use std::path::Path;
use std::sync::Arc;
use crate::style::{Color, FileIconPalette, Span};
#[derive(Clone, Debug, PartialEq)]
pub struct FileIconOverride {
pub icon: Arc<str>,
pub color: Option<Color>,
}
pub fn file_icon_span(name: &str, palette: &FileIconPalette) -> Span {
let (glyph, color) = file_icon(name, palette);
let mut span = Span::new(glyph);
if let Some(color) = color {
span = span.fg(color);
}
span
}
pub fn file_icon(name: &str, palette: &FileIconPalette) -> (&'static str, Option<Color>) {
let path_obj = Path::new(name);
let name = path_obj.file_name().and_then(|n| n.to_str()).unwrap_or("");
let name_lower = name.to_lowercase();
match name_lower.as_str() {
"dockerfile" => ("", Some(palette.cyan)),
"package.json" => ("", Some(palette.green)),
"package-lock.json" => ("", Some(palette.grey)),
"readme.md" | "readme" => ("", Some(palette.yellow)),
"license" | "license.md" | "license.txt" => ("", Some(palette.cyan)),
"makefile" | "makefile.am" | "makefile.in" => ("", Some(palette.yellow)),
"cmakelists.txt" => ("", Some(palette.red)),
".gitignore" | ".gitattributes" | ".gitmodules" => ("", Some(palette.red)),
".dockerignore" => ("", Some(palette.orange)),
".editorconfig" => ("", Some(palette.grey)),
".eslintignore" | ".eslintrc" | ".eslintrc.js" | ".eslintrc.json" => {
("", Some(palette.purple))
}
".prettierrc" | ".prettierrc.js" | ".prettierrc.json" | ".prettierignore" => {
("", Some(palette.orange))
}
_ => {
let Some(ext) = path_obj.extension().and_then(|e| e.to_str()) else {
return ("", None);
};
match ext.to_lowercase().as_str() {
"rs" => ("", Some(palette.red)),
"toml" => ("", Some(palette.grey)),
"py" | "pyw" | "pyi" => ("", Some(palette.yellow)),
"pyc" | "pyd" | "pyo" => ("", Some(palette.grey)),
"js" | "mjs" | "cjs" | "jsx" => ("", Some(palette.yellow)),
"ts" => ("", Some(palette.cyan)),
"tsx" => ("", Some(palette.cyan)),
"html" | "htm" => ("", Some(palette.orange)),
"css" => ("", Some(palette.blue)),
"scss" | "sass" => ("", Some(palette.red)),
"less" => ("", Some(palette.blue)),
"json" | "jsonc" => ("", Some(palette.grey)),
"yaml" | "yml" => ("", Some(palette.grey)),
"c" => ("", Some(palette.blue)),
"cpp" | "cc" | "cxx" => ("", Some(palette.azure)),
"h" | "hpp" => ("", Some(palette.purple)),
"go" | "mod" | "sum" => ("", Some(palette.cyan)),
"rb" | "erb" | "rbw" => ("", Some(palette.red)),
"gemfile" | "gemfile.lock" => ("", Some(palette.red)),
"sh" | "bash" | "zsh" | "fish" => ("", Some(palette.green)),
"ps1" | "psm1" | "psd1" => ("", Some(palette.blue)),
"java" | "jar" => ("", Some(palette.orange)),
"gradle" => ("", Some(palette.green)),
"kt" | "kts" => ("", Some(palette.purple)),
"md" | "markdown" | "rst" => ("", Some(palette.azure)),
"txt" => ("", Some(palette.grey)),
"png" => ("", Some(palette.purple)),
"jpg" | "jpeg" => ("", Some(palette.purple)),
"gif" => ("", Some(palette.purple)),
"svg" => ("", Some(palette.orange)),
"webp" => ("", Some(palette.blue)),
"bmp" | "ico" | "tiff" | "tif" => ("", Some(palette.purple)),
"zip" | "tar" | "gz" | "tgz" | "bz2" | "xz" | "7z" | "rar" => {
("", Some(palette.blue))
}
"git" | "gitignore" | "gitattributes" | "gitmodules" => ("", Some(palette.red)),
"lock" => ("", Some(palette.grey)),
"sql" => ("", Some(palette.yellow)),
"db" | "sqlite" | "sqlite3" => ("", Some(palette.grey)),
"conf" | "cfg" | "config" | "ini" => ("", Some(palette.grey)),
"log" => ("", Some(palette.grey)),
"vim" | "nvim" => ("", Some(palette.green)),
"lua" => ("", Some(palette.blue)),
"swift" => ("", Some(palette.red)),
"rsx" => ("", Some(palette.orange)),
_ => ("", None),
}
}
}
}