use crate::{chunk::Chunk, options::Options};
use phf::phf_map;
use smallvec::SmallVec;
use smol_str::{format_smolstr, SmolStr, SmolStrBuilder};
#[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Clone, Copy)]
pub enum MatchKind {
Generic,
Indicator,
ProjectManifest,
}
#[derive(Debug, PartialEq, Eq, Clone, Copy)]
pub enum Language {
Agda,
Assembly,
Awk,
CCpp,
CSharp,
Chapel,
Clojure,
Cobol,
CoffeeScript,
CommonLisp,
Config,
Css,
D,
Dart,
Dhall,
Eiffel,
Elixir,
Elm,
Erlang,
FSharp,
Forth,
Fortran,
Go,
Haskell,
Haxe,
Html,
Idris,
Java,
JavaScript,
Julia,
Kotlin,
LaTeX,
Lua,
Nim,
Nix,
Nmap,
ObjectiveC,
OCaml,
Pascal,
Perl,
Php,
PowerShell,
Prolog,
Python,
R,
Racket,
Ruby,
Rust,
Scala,
Shell,
SmallTalk,
Swift,
Tcl,
TypeScript,
Unison,
Vala,
Verilog,
Vhdl,
Zig,
}
#[allow(dead_code)]
pub struct LanguageInfo {
pub icon: &'static str,
pub color: &'static str,
pub cterm_color: &'static str,
pub name: &'static str,
pub lang: Language,
pub kind: MatchKind,
}
static MANIFEST_MAP: phf::Map<&'static str, LanguageInfo> = phf_map! {
".agda" => LanguageInfo { icon: "A", color: "#F1D352", cterm_color: "221", name: "Agda", lang: Language::Agda, kind: MatchKind::Indicator },
".lagda" => LanguageInfo { icon: "A", color: "#F1D352", cterm_color: "221", name: "Agda", lang: Language::Agda, kind: MatchKind::Indicator },
".asm" => LanguageInfo { icon: "", color: "#6E8493", cterm_color: "102", name: "Assembly", lang: Language::Assembly, kind: MatchKind::Generic },
".awk" => LanguageInfo { icon: "", color: "#E5E5E5", cterm_color: "254", name: "Awk", lang: Language::Awk, kind: MatchKind::Indicator },
".mawk" => LanguageInfo { icon: "", color: "#E5E5E5", cterm_color: "254", name: "Awk", lang: Language::Awk, kind: MatchKind::Indicator },
".gawk" => LanguageInfo { icon: "", color: "#E5E5E5", cterm_color: "254", name: "Awk", lang: Language::Awk, kind: MatchKind::Indicator },
"Makefile" => LanguageInfo { icon: "", color: "#6792c9", cterm_color: "67", name: "C/C++", lang: Language::CCpp, kind: MatchKind::Generic },
"Makefile.am" => LanguageInfo { icon: "", color: "#6792c9", cterm_color: "67", name: "C/C++", lang: Language::CCpp, kind: MatchKind::Generic },
"CMakeLists.txt" => LanguageInfo { icon: "", color: "#6792c9", cterm_color: "67", name: "C/C++", lang: Language::CCpp, kind: MatchKind::Generic },
"meson.build" => LanguageInfo { icon: "", color: "#6792c9", cterm_color: "67", name: "C/C++", lang: Language::CCpp, kind: MatchKind::Generic },
"autogen.sh" => LanguageInfo { icon: "", color: "#6792c9", cterm_color: "67", name: "C/C++", lang: Language::CCpp, kind: MatchKind::Generic },
"configure.ac" => LanguageInfo { icon: "", color: "#6792c9", cterm_color: "67", name: "C/C++", lang: Language::CCpp, kind: MatchKind::Generic },
".c" => LanguageInfo { icon: "", color: "#6792c9", cterm_color: "67", name: "C/C++", lang: Language::CCpp, kind: MatchKind::Indicator },
".h" => LanguageInfo { icon: "", color: "#6792c9", cterm_color: "67", name: "C/C++", lang: Language::CCpp, kind: MatchKind::Indicator },
".inc" => LanguageInfo { icon: "", color: "#B3B3B3", cterm_color: "249", name: "C/C++ Header", lang: Language::CCpp, kind: MatchKind::Generic },
".cpp" => LanguageInfo { icon: "", color: "#6792c9", cterm_color: "67", name: "C/C++", lang: Language::CCpp, kind: MatchKind::Indicator },
".hpp" => LanguageInfo { icon: "", color: "#6792c9", cterm_color: "67", name: "C/C++", lang: Language::CCpp, kind: MatchKind::Indicator },
".cxx" => LanguageInfo { icon: "", color: "#6792c9", cterm_color: "67", name: "C++", lang: Language::CCpp, kind: MatchKind::Indicator },
".cc" => LanguageInfo { icon: "", color: "#6792c9", cterm_color: "67", name: "C++", lang: Language::CCpp, kind: MatchKind::Indicator },
".csproj" => LanguageInfo { icon: "", color: "#5a29a4", cterm_color: "99", name: "C#", lang: Language::CSharp, kind: MatchKind::ProjectManifest},
".cs" => LanguageInfo { icon: "", color: "#5a29a4", cterm_color: "99", name: "C#", lang: Language::CSharp, kind: MatchKind::Indicator },
".chpl" => LanguageInfo { icon: "C", color: "#8dc63f", cterm_color: "113", name: "Chapel", lang: Language::Chapel, kind: MatchKind::Indicator },
".clj" => LanguageInfo { icon: "", color: "#82b131", cterm_color: "106", name: "Clojure", lang: Language::Clojure, kind: MatchKind::Indicator },
".cljs" => LanguageInfo { icon: "", color: "#82b131", cterm_color: "106", name: "ClojureScript", lang: Language::Clojure, kind: MatchKind::Indicator },
".cljc" => LanguageInfo { icon: "", color: "#82b131", cterm_color: "106", name: "Clojure", lang: Language::Clojure, kind: MatchKind::Indicator },
".edn" => LanguageInfo { icon: "", color: "#82b131", cterm_color: "106", name: "EDN", lang: Language::Clojure, kind: MatchKind::Generic },
".cbl" => LanguageInfo { icon: "C", color: "#005ca5", cterm_color: "25", name: "COBOL", lang: Language::Cobol, kind: MatchKind::Indicator},
"Cakefile" => LanguageInfo { icon: "", color: "#244776", cterm_color: "24", name: "CoffeeScript", lang: Language::CoffeeScript, kind: MatchKind::Indicator },
".coffee" => LanguageInfo { icon: "", color: "#244776", cterm_color: "24", name: "CoffeeScript", lang: Language::CoffeeScript, kind: MatchKind::Indicator },
".asd" => LanguageInfo { icon: "", color: "#b31a23", cterm_color: "124", name: "Common Lisp", lang: Language::CommonLisp, kind: MatchKind::ProjectManifest},
".lisp" => LanguageInfo { icon: "", color: "#b31a23", cterm_color: "124", name: "Lisp", lang: Language::CommonLisp, kind: MatchKind::Indicator },
".cl" => LanguageInfo { icon: "", color: "#b31a23", cterm_color: "124", name: "Common Lisp", lang: Language::CommonLisp, kind: MatchKind::Indicator },
".config" => LanguageInfo { icon: "", color: "#A0A0A0", cterm_color: "247", name: "Config", lang: Language::Config, kind: MatchKind::Generic },
".conf" => LanguageInfo { icon: "", color: "#A0A0A0", cterm_color: "247", name: "Config", lang: Language::Config, kind: MatchKind::Generic },
".cfg" => LanguageInfo { icon: "", color: "#A0A0A0", cterm_color: "247", name: "Config", lang: Language::Config, kind: MatchKind::Generic },
".ini" => LanguageInfo { icon: "", color: "#A0A0A0", cterm_color: "247", name: "INI", lang: Language::Config, kind: MatchKind::Generic },
".toml" => LanguageInfo { icon: "", color: "#A0A0A0", cterm_color: "247", name: "TOML", lang: Language::Config, kind: MatchKind::Generic },
".yaml" => LanguageInfo { icon: "", color: "#A0A0A0", cterm_color: "247", name: "YAML", lang: Language::Config, kind: MatchKind::Generic },
".yml" => LanguageInfo { icon: "", color: "#A0A0A0", cterm_color: "247", name: "YAML", lang: Language::Config, kind: MatchKind::Generic },
".json" => LanguageInfo { icon: "", color: "#E5E5E5", cterm_color: "254", name: "JSON", lang: Language::Config, kind: MatchKind::Generic },
".css" => LanguageInfo { icon: "", color: "#563d7c", cterm_color: "98", name: "CSS", lang: Language::Css, kind: MatchKind::Indicator },
"dub.json" => LanguageInfo { icon: "D", color: "#ba595e", cterm_color: "131", name: "D", lang: Language::D, kind: MatchKind::ProjectManifest},
"dub.sdl" => LanguageInfo { icon: "D", color: "#ba595e", cterm_color: "131", name: "D", lang: Language::D, kind: MatchKind::ProjectManifest},
".d" => LanguageInfo { icon: "D", color: "#ba595e", cterm_color: "131", name: "D", lang: Language::D, kind: MatchKind::Indicator },
"pubspec.yaml" => LanguageInfo { icon: "", color: "#0175c2", cterm_color: "32", name: "Dart", lang: Language::Dart, kind: MatchKind::ProjectManifest},
".dart" => LanguageInfo { icon: "", color: "#0175c2", cterm_color: "32", name: "Dart", lang: Language::Dart, kind: MatchKind::Indicator },
".dhall" => LanguageInfo { icon: "D", color: "#174B59", cterm_color: "23", name: "Dhall", lang: Language::Dhall, kind: MatchKind::Indicator },
".ecf" => LanguageInfo { icon: "E", color: "#0C8B95", cterm_color: "30", name: "Eiffel", lang: Language::Eiffel, kind: MatchKind::ProjectManifest},
"mix.exs" => LanguageInfo { icon: "", color: "#4b275f", cterm_color: "54", name: "Elixir", lang: Language::Elixir, kind: MatchKind::ProjectManifest},
".ex" => LanguageInfo { icon: "", color: "#4b275f", cterm_color: "54", name: "Elixir", lang: Language::Elixir, kind: MatchKind::Indicator },
".exs" => LanguageInfo { icon: "", color: "#4b275f", cterm_color: "54", name: "Elixir", lang: Language::Elixir, kind: MatchKind::Indicator },
"elm.json" => LanguageInfo { icon: "", color: "#60b5cc", cterm_color: "74", name: "Elm", lang: Language::Elm, kind: MatchKind::ProjectManifest},
".erl" => LanguageInfo { icon: "", color: "#b83998", cterm_color: "133", name: "Erlang", lang: Language::Erlang, kind: MatchKind::Indicator },
".hrl" => LanguageInfo { icon: "", color: "#b83998", cterm_color: "133", name: "Erlang", lang: Language::Erlang, kind: MatchKind::Indicator},
".fsproj" => LanguageInfo { icon: "", color: "#378bba", cterm_color: "38", name: "F#", lang: Language::FSharp, kind: MatchKind::ProjectManifest},
".fs" => LanguageInfo { icon: "", color: "#378bba", cterm_color: "38", name: "F#", lang: Language::FSharp, kind: MatchKind::Indicator },
".fsx" => LanguageInfo { icon: "", color: "#378bba", cterm_color: "38", name: "F#", lang: Language::FSharp, kind: MatchKind::Indicator },
".fth" => LanguageInfo { icon: "F", color: "#341708", cterm_color: "52", name: "Forth", lang: Language::Forth, kind: MatchKind::Generic },
".f90" => LanguageInfo { icon: "", color: "#734f96", cterm_color: "98", name: "Fortran", lang: Language::Fortran, kind: MatchKind::Indicator},
".f95" => LanguageInfo { icon: "", color: "#734f96", cterm_color: "98", name: "Fortran", lang: Language::Fortran, kind: MatchKind::Indicator},
".f" => LanguageInfo { icon: "", color: "#734f96", cterm_color: "98", name: "Fortran", lang: Language::Fortran, kind: MatchKind::Indicator},
"go.mod" => LanguageInfo { icon: "", color: "#00add8", cterm_color: "38", name: "Go", lang: Language::Go, kind: MatchKind::ProjectManifest},
".go" => LanguageInfo { icon: "", color: "#00add8", cterm_color: "38", name: "Go", lang: Language::Go, kind: MatchKind::Indicator },
".cabal" => LanguageInfo { icon: "", color: "#5e5086", cterm_color: "61", name: "Haskell", lang: Language::Haskell, kind: MatchKind::ProjectManifest},
"stack.yaml" => LanguageInfo { icon: "", color: "#5e5086", cterm_color: "61", name: "Haskell", lang: Language::Haskell, kind: MatchKind::ProjectManifest},
"Setup.hs" => LanguageInfo { icon: "", color: "#5e5086", cterm_color: "61", name: "Haskell", lang: Language::Haskell, kind: MatchKind::Indicator },
".hs" => LanguageInfo { icon: "", color: "#5e5086", cterm_color: "61", name: "Haskell", lang: Language::Haskell, kind: MatchKind::Indicator },
".lhs" => LanguageInfo { icon: "", color: "#5e5086", cterm_color: "61", name: "Haskell", lang: Language::Haskell, kind: MatchKind::Indicator },
"haxelib.json" => LanguageInfo { icon: "H", color: "#DF7900", cterm_color: "208", name: "Haxe", lang: Language::Haxe, kind: MatchKind::ProjectManifest},
".hxml" => LanguageInfo { icon: "H", color: "#DF7900", cterm_color: "208", name: "Haxe", lang: Language::Haxe, kind: MatchKind::Indicator },
".html" => LanguageInfo { icon: "", color: "#e34c26", cterm_color: "196", name: "HTML", lang: Language::Html, kind: MatchKind::Indicator },
".htm" => LanguageInfo { icon: "", color: "#e34c26", cterm_color: "196", name: "HTML", lang: Language::Html, kind: MatchKind::Indicator },
".idr" => LanguageInfo { icon: "I", color: "#1F232D", cterm_color: "235", name: "Idris", lang: Language::Idris, kind: MatchKind::Indicator },
".lidr" => LanguageInfo { icon: "I", color: "#1F232D", cterm_color: "235", name: "Idris", lang: Language::Idris, kind: MatchKind::Indicator },
"pom.xml" => LanguageInfo { icon: "", color: "#cc0000", cterm_color: "160", name: "Java/JVM", lang: Language::Java, kind: MatchKind::ProjectManifest},
"build.gradle" => LanguageInfo { icon: "", color: "#cc0000", cterm_color: "160", name: "Java/JVM", lang: Language::Java, kind: MatchKind::Generic },
".java" => LanguageInfo { icon: "", color: "#cc0000", cterm_color: "160", name: "Java", lang: Language::Java, kind: MatchKind::Indicator },
"package.json" => LanguageInfo { icon: "", color: "#f0db4f", cterm_color: "220", name: "JavaScript/Node", lang: Language::JavaScript, kind: MatchKind::ProjectManifest},
"tsconfig.json" => LanguageInfo { icon: "", color: "#3178c6", cterm_color: "39", name: "TypeScript", lang: Language::TypeScript, kind: MatchKind::ProjectManifest},
"Project.toml" => LanguageInfo { icon: "", color: "#a270ba", cterm_color: "140", name: "Julia", lang: Language::Julia, kind: MatchKind::ProjectManifest},
"build.gradle.kts" => LanguageInfo { icon: "", color: "#7f52ff", cterm_color: "99", name: "Kotlin", lang: Language::Kotlin, kind: MatchKind::Indicator},
".kt" => LanguageInfo { icon: "", color: "#7f52ff", cterm_color: "99", name: "Kotlin", lang: Language::Kotlin, kind: MatchKind::Indicator },
".kts" => LanguageInfo { icon: "", color: "#7f52ff", cterm_color: "99", name: "Kotlin", lang: Language::Kotlin, kind: MatchKind::Indicator },
".tex" => LanguageInfo { icon: "", color: "#008080", cterm_color: "30", name: "LaTeX", lang: Language::LaTeX, kind: MatchKind::Indicator},
".latex" => LanguageInfo { icon: "", color: "#008080", cterm_color: "30", name: "LaTeX", lang: Language::LaTeX, kind: MatchKind::Indicator},
".rockspec" => LanguageInfo { icon: "", color: "#2c2d72", cterm_color: "18", name: "Lua", lang: Language::Lua, kind: MatchKind::ProjectManifest},
".lua" => LanguageInfo { icon: "", color: "#2c2d72", cterm_color: "18", name: "Lua", lang: Language::Lua, kind: MatchKind::Indicator},
".nimble" => LanguageInfo { icon: "", color: "#ffc200", cterm_color: "220", name: "Nim", lang: Language::Nim, kind: MatchKind::ProjectManifest},
".nim" => LanguageInfo { icon: "", color: "#ffc200", cterm_color: "220", name: "Nim", lang: Language::Nim, kind: MatchKind::Indicator },
"flake.nix" => LanguageInfo { icon: "", color: "#7E76D4", cterm_color: "104", name: "Nix", lang: Language::Nix, kind: MatchKind::ProjectManifest},
".nse" => LanguageInfo { icon: "N", color: "#404040", cterm_color: "238", name: "Nmap Script", lang: Language::Nmap, kind: MatchKind::Indicator },
"project.pbxproj" => LanguageInfo { icon: "", color: "#6792c9", cterm_color: "67", name: "Objective-C", lang: Language::ObjectiveC, kind: MatchKind::Generic },
".m" => LanguageInfo { icon: "", color: "#6792c9", cterm_color: "67", name: "Objective-C", lang: Language::ObjectiveC, kind: MatchKind::Generic },
"dune-project" => LanguageInfo { icon: "", color: "#ec6813", cterm_color: "166", name: "OCaml", lang: Language::OCaml, kind: MatchKind::ProjectManifest},
"opam" => LanguageInfo { icon: "", color: "#ec6813", cterm_color: "166", name: "OCaml", lang: Language::OCaml, kind: MatchKind::ProjectManifest},
".ml" => LanguageInfo { icon: "", color: "#ec6813", cterm_color: "166", name: "OCaml", lang: Language::OCaml, kind: MatchKind::Indicator },
".mli" => LanguageInfo { icon: "", color: "#ec6813", cterm_color: "166", name: "OCaml", lang: Language::OCaml, kind: MatchKind::Indicator },
".dpr" => LanguageInfo { icon: "P", color: "#e32b2f", cterm_color: "196", name: "Delphi/Pascal", lang: Language::Pascal, kind: MatchKind::Indicator },
".lpr" => LanguageInfo { icon: "P", color: "#EEDD34", cterm_color: "184", name: "Lazarus/Pascal", lang: Language::Pascal, kind: MatchKind::Indicator },
".pl" => LanguageInfo { icon: "", color: "#39457e", cterm_color: "61", name: "Perl", lang: Language::Perl, kind: MatchKind::Indicator},
".pm" => LanguageInfo { icon: "", color: "#39457e", cterm_color: "61", name: "Perl", lang: Language::Perl, kind: MatchKind::Indicator },
"composer.json" => LanguageInfo { icon: "", color: "#8892be", cterm_color: "103", name: "PHP", lang: Language::Php, kind: MatchKind::ProjectManifest},
".php" => LanguageInfo { icon: "", color: "#8892be", cterm_color: "103", name: "PHP", lang: Language::Php, kind: MatchKind::Indicator },
".psd1" => LanguageInfo { icon: "", color: "#012456", cterm_color: "18", name: "PowerShell", lang: Language::PowerShell, kind: MatchKind::Indicator },
".pro" => LanguageInfo { icon: "P", color: "#880000", cterm_color: "88", name: "Prolog", lang: Language::Prolog, kind: MatchKind::Generic },
"pyproject.toml" => LanguageInfo { icon: "", color: "#f6c43b", cterm_color: "203", name: "Python", lang: Language::Python, kind: MatchKind::ProjectManifest},
"Pipfile" => LanguageInfo { icon: "", color: "#f6c43b", cterm_color: "203", name: "Python", lang: Language::Python, kind: MatchKind::ProjectManifest},
".py" => LanguageInfo { icon: "", color: "#f6c43b", cterm_color: "203", name: "Python", lang: Language::Python, kind: MatchKind::Indicator },
".pyx" => LanguageInfo { icon: "", color: "#f6c43b", cterm_color: "203", name: "Cython", lang: Language::Python, kind: MatchKind::Indicator },
".r" => LanguageInfo { icon: "", color: "#276dc2", cterm_color: "33", name: "R", lang: Language::R, kind: MatchKind::Indicator },
"info.rkt" => LanguageInfo { icon: "R", color: "#394FAC", cterm_color: "61", name: "Racket", lang: Language::Racket, kind: MatchKind::ProjectManifest},
"Gemfile" => LanguageInfo { icon: "", color: "#cc342d", cterm_color: "160", name: "Ruby", lang: Language::Ruby, kind: MatchKind::ProjectManifest},
".gemspec" => LanguageInfo { icon: "", color: "#cc342d", cterm_color: "160", name: "Ruby", lang: Language::Ruby, kind: MatchKind::ProjectManifest},
".rb" => LanguageInfo { icon: "", color: "#cc342d", cterm_color: "160", name: "Ruby", lang: Language::Ruby, kind: MatchKind::Indicator },
"Cargo.toml" => LanguageInfo { icon: "", color: "#dea584", cterm_color: "173", name: "Rust", lang: Language::Rust, kind: MatchKind::ProjectManifest},
".rs" => LanguageInfo { icon: "", color: "#dea584", cterm_color: "173", name: "Rust", lang: Language::Rust, kind: MatchKind::Indicator },
"build.sbt" => LanguageInfo { icon: "", color: "#c22d40", cterm_color: "160", name: "Scala", lang: Language::Scala, kind: MatchKind::ProjectManifest},
".sh" => LanguageInfo { icon: "", color: "#89E051", cterm_color: "113", name: "Shell", lang: Language::Shell, kind: MatchKind::Indicator},
".bash" => LanguageInfo { icon: "", color: "#89E051", cterm_color: "113", name: "Bash", lang: Language::Shell, kind: MatchKind::Indicator },
".csh" => LanguageInfo { icon: "", color: "#89E051", cterm_color: "113", name: "Csh", lang: Language::Shell, kind: MatchKind::Indicator },
".tcsh" => LanguageInfo { icon: "", color: "#89E051", cterm_color: "113", name: "Tcsh", lang: Language::Shell, kind: MatchKind::Indicator },
".fish" => LanguageInfo { icon: "", color: "#89E051", cterm_color: "113", name: "Fish", lang: Language::Shell, kind: MatchKind::Indicator },
".ksh" => LanguageInfo { icon: "", color: "#89E051", cterm_color: "113", name: "Ksh", lang: Language::Shell, kind: MatchKind::Indicator },
".zsh" => LanguageInfo { icon: "", color: "#89E051", cterm_color: "113", name: "Zsh", lang: Language::Shell, kind: MatchKind::Indicator },
".st" => LanguageInfo { icon: "S", color: "#596700", cterm_color: "58", name: "SmallTalk", lang: Language::SmallTalk, kind: MatchKind::Indicator },
"Package.swift" => LanguageInfo { icon: "", color: "#ffac45", cterm_color: "215", name: "Swift", lang: Language::Swift, kind: MatchKind::ProjectManifest},
".tcl" => LanguageInfo { icon: "T", color: "#1D529D", cterm_color: "25", name: "Tcl", lang: Language::Tcl, kind: MatchKind::Indicator},
".u" => LanguageInfo { icon: "U", color: "#FF7A62", cterm_color: "209", name: "Unison", lang: Language::Unison, kind: MatchKind::Indicator },
".vala" => LanguageInfo { icon: "", color: "#7239B3", cterm_color: "98", name: "Vala", lang: Language::Vala, kind: MatchKind::Indicator},
".v" => LanguageInfo { icon: "V", color: "#000080", cterm_color: "18", name: "Verilog", lang: Language::Verilog, kind: MatchKind::Generic },
".vh" => LanguageInfo { icon: "V", color: "#000080", cterm_color: "18", name: "Verilog", lang: Language::Verilog, kind: MatchKind::Generic },
".sv" => LanguageInfo { icon: "V", color: "#000080", cterm_color: "18", name: "Verilog", lang: Language::Verilog, kind: MatchKind::Generic},
".vhd" => LanguageInfo { icon: "V", color: "#AD0000", cterm_color: "88", name: "VHDL", lang: Language::Vhdl, kind: MatchKind::Indicator},
".vhdl" => LanguageInfo { icon: "V", color: "#AD0000", cterm_color: "88", name: "VHDL", lang: Language::Vhdl, kind: MatchKind::Indicator},
"build.zig" => LanguageInfo { icon: "", color: "#f7a41d", cterm_color: "214", name: "Zig", lang: Language::Zig, kind: MatchKind::ProjectManifest},
".zig" => LanguageInfo { icon: "", color: "#f7a41d", cterm_color: "214", name: "Zig", lang: Language::Zig, kind: MatchKind::Indicator },
};
#[derive(Clone, Copy)]
enum VersionStrategy {
QuotedAfter(&'static str),
LineFirstQuoted(&'static str),
LineUnquoted(&'static str),
XmlBetween(&'static str, &'static str),
}
fn version_strategy(lang: Language, key: &str) -> Option<VersionStrategy> {
use Language::*;
Some(match (lang, key) {
(Rust, _) | (Julia, _) | (Nim, _) => VersionStrategy::LineFirstQuoted("version"),
(Python, "pyproject.toml") => VersionStrategy::LineFirstQuoted("version"),
(Lua, ".rockspec") => VersionStrategy::LineFirstQuoted("version"),
(D, "dub.sdl") => VersionStrategy::LineFirstQuoted("version"),
(D, "dub.json") => VersionStrategy::QuotedAfter("\"version\": \""),
(OCaml, "opam") => VersionStrategy::LineFirstQuoted("version"),
(OCaml, "dune-project") => VersionStrategy::LineUnquoted("(version "),
(Elixir, _) => VersionStrategy::QuotedAfter("version: \""),
(JavaScript, _) | (Php, _) | (Haxe, _) | (Elm, _) => {
VersionStrategy::QuotedAfter("\"version\": \"")
}
(Ruby, ".gemspec") => VersionStrategy::QuotedAfter(".version = \""),
(Scala, _) => VersionStrategy::QuotedAfter("version := \""),
(CommonLisp, _) => VersionStrategy::QuotedAfter(":version \""),
(Racket, _) => VersionStrategy::QuotedAfter("(define version \""),
(Haskell, ".cabal") | (Dart, _) => VersionStrategy::LineUnquoted("version:"),
(Java, _) => VersionStrategy::XmlBetween("<version>", "</version>"),
(CSharp, _) | (FSharp, _) => VersionStrategy::XmlBetween("<Version>", "</Version>"),
_ => return None,
})
}
fn extract_version(strategy: VersionStrategy, content: &str) -> Option<SmolStr> {
match strategy {
VersionStrategy::QuotedAfter(needle) => {
let start = content.find(needle)? + needle.len();
let rest = &content[start..];
let end = rest.find('"')?;
let v = &rest[..end];
(!v.is_empty()).then(|| SmolStr::new(v))
}
VersionStrategy::LineFirstQuoted(prefix) => {
for line in content.lines() {
if !line.starts_with(prefix) {
continue;
}
let q_open = line.find('"')?;
let rest = &line[q_open + 1..];
let q_end = rest.find('"')?;
let v = &rest[..q_end];
if !v.is_empty() {
return Some(SmolStr::new(v));
}
}
None
}
VersionStrategy::LineUnquoted(prefix) => {
for line in content.lines() {
if !line.starts_with(prefix) {
continue;
}
let rest = line[prefix.len()..].trim_start();
let end = rest
.find(|c: char| c.is_whitespace() || c == ')' || c == '#')
.unwrap_or(rest.len());
let v = &rest[..end];
if !v.is_empty() {
return Some(SmolStr::new(v));
}
}
None
}
VersionStrategy::XmlBetween(open, close) => {
let start = content.find(open)? + open.len();
let rest = &content[start..];
let end = rest.find(close)?;
let v = rest[..end].trim();
(!v.is_empty()).then(|| SmolStr::new(v))
}
}
}
async fn version_from_file(path: &std::path::Path, lang: Language, key: &str) -> Option<SmolStr> {
let strategy = version_strategy(lang, key)?;
let content = tokio::fs::read_to_string(path).await.ok()?;
extract_version(strategy, &content)
}
pub async fn show(opts: &Options) -> Option<Chunk<SmolStr>> {
if !opts.nerd_font || !opts.manifest {
return None;
}
let mut entries = tokio::fs::read_dir(".").await.ok()?;
let mut languages: SmallVec<[&LanguageInfo; 8]> = SmallVec::new();
let mut manifests: SmallVec<[(std::path::PathBuf, Language, SmolStr); 4]> = SmallVec::new();
while let Some(entry) = entries.next_entry().await.ok()? {
let file_name = entry.file_name();
let Some(name) = file_name.to_str() else {
continue;
};
if name.starts_with('.') {
continue;
}
if let Some(lang) = MANIFEST_MAP.get(name) {
if lang.kind == MatchKind::ProjectManifest {
manifests.push((entry.path(), lang.lang, SmolStr::new(name)));
}
languages.push(lang);
} else if let Some(ext) = entry.path().extension().and_then(|s| s.to_str()) {
let key = format_smolstr!(".{ext}");
if let Some(lang) = MANIFEST_MAP.get(key.as_str()) {
if lang.kind == MatchKind::ProjectManifest {
manifests.push((entry.path(), lang.lang, key));
}
languages.push(lang);
}
}
}
languages.sort_by(|a, b| {
let ord = b.kind.cmp(&a.kind);
if ord == std::cmp::Ordering::Equal {
a.icon.cmp(b.icon)
} else {
ord
}
});
let top_kind = languages.first()?.kind;
languages.retain(|lang| lang.kind == top_kind);
let mut builder = SmolStrBuilder::new();
let mut cur_icon = "";
for lang in &languages {
if lang.icon != cur_icon {
builder.push_str(lang.icon);
cur_icon = lang.icon;
}
}
let icons = builder.finish();
let version = if top_kind == MatchKind::ProjectManifest {
let mut found = None;
for (path, lang, key) in &manifests {
if let Some(v) = version_from_file(path, *lang, key).await {
found = Some(v);
break;
}
}
found
} else {
None
};
Some(match version {
Some(v) => Chunk::new(icons, format_smolstr!("v{v}")),
None => Chunk::icon(icons),
})
}