gitlogue 0.9.0

A Git history screensaver - watch your code rewrite itself
Documentation
pub mod astro;
pub mod bash;
pub mod c;
pub mod clojure;
pub mod cpp;
pub mod csharp;
pub mod css;
pub mod dart;
pub mod elixir;
pub mod erlang;
pub mod go_lang;
pub mod haskell;
pub mod html;
pub mod java;
pub mod javascript;
pub mod json;
pub mod kotlin;
pub mod lua;
pub mod markdown;
pub mod nix;
pub mod php;
pub mod python;
pub mod ruby;
pub mod rust;
pub mod scala;
pub mod svelte;
pub mod swift;
pub mod typescript;
pub mod xml;
pub mod yaml;
pub mod zig;

use std::path::Path;
use tree_sitter::Language;

#[derive(Clone)]
pub struct LanguageSupport {
    pub language: Language,
    pub highlight_query: &'static str,
    pub injection_query: Option<&'static str>,
}

pub fn get_language(path: &Path) -> Option<LanguageSupport> {
    let extension = path.extension()?.to_str()?;
    by_name(extension)
}

pub fn get_language_by_name(name: &str) -> Option<LanguageSupport> {
    by_name(name.trim().trim_start_matches('.'))
}

fn by_name(raw: &str) -> Option<LanguageSupport> {
    let canonical = canonicalize(raw)?;
    match canonical {
        "astro" => Some(LanguageSupport {
            language: astro::language(),
            highlight_query: astro::HIGHLIGHT_QUERY,
            injection_query: Some(astro::INJECTION_QUERY),
        }),
        "bash" => Some(LanguageSupport {
            language: bash::language(),
            highlight_query: bash::HIGHLIGHT_QUERY,
            injection_query: None,
        }),
        "c" => Some(LanguageSupport {
            language: c::language(),
            highlight_query: c::HIGHLIGHT_QUERY,
            injection_query: None,
        }),
        "clojure" => Some(LanguageSupport {
            language: clojure::language(),
            highlight_query: clojure::HIGHLIGHT_QUERY,
            injection_query: None,
        }),
        "cpp" => Some(LanguageSupport {
            language: cpp::language(),
            highlight_query: cpp::HIGHLIGHT_QUERY,
            injection_query: None,
        }),
        "csharp" => Some(LanguageSupport {
            language: csharp::language(),
            highlight_query: csharp::HIGHLIGHT_QUERY,
            injection_query: None,
        }),
        "css" => Some(LanguageSupport {
            language: css::language(),
            highlight_query: css::HIGHLIGHT_QUERY,
            injection_query: None,
        }),
        "dart" => Some(LanguageSupport {
            language: dart::language(),
            highlight_query: dart::HIGHLIGHT_QUERY,
            injection_query: None,
        }),
        "elixir" => Some(LanguageSupport {
            language: elixir::language(),
            highlight_query: elixir::HIGHLIGHT_QUERY,
            injection_query: None,
        }),
        "erlang" => Some(LanguageSupport {
            language: erlang::language(),
            highlight_query: erlang::HIGHLIGHT_QUERY,
            injection_query: None,
        }),
        "go" => Some(LanguageSupport {
            language: go_lang::language(),
            highlight_query: go_lang::HIGHLIGHT_QUERY,
            injection_query: None,
        }),
        "haskell" => Some(LanguageSupport {
            language: haskell::language(),
            highlight_query: haskell::HIGHLIGHT_QUERY,
            injection_query: None,
        }),
        "html" => Some(LanguageSupport {
            language: html::language(),
            highlight_query: html::HIGHLIGHT_QUERY,
            injection_query: Some(html::INJECTION_QUERY),
        }),
        "java" => Some(LanguageSupport {
            language: java::language(),
            highlight_query: java::HIGHLIGHT_QUERY,
            injection_query: None,
        }),
        "javascript" => Some(LanguageSupport {
            language: javascript::language(),
            highlight_query: javascript::HIGHLIGHT_QUERY,
            injection_query: None,
        }),
        "json" => Some(LanguageSupport {
            language: json::language(),
            highlight_query: json::HIGHLIGHT_QUERY,
            injection_query: None,
        }),
        "kotlin" => Some(LanguageSupport {
            language: kotlin::language(),
            highlight_query: kotlin::HIGHLIGHT_QUERY,
            injection_query: None,
        }),
        "lua" => Some(LanguageSupport {
            language: lua::language(),
            highlight_query: lua::HIGHLIGHT_QUERY,
            injection_query: None,
        }),
        "markdown" => Some(LanguageSupport {
            language: markdown::language(),
            highlight_query: markdown::HIGHLIGHT_QUERY,
            injection_query: Some(markdown::INJECTION_QUERY),
        }),
        "nix" => Some(LanguageSupport {
            language: nix::language(),
            highlight_query: nix::HIGHLIGHT_QUERY,
            injection_query: Some(nix::INJECTION_QUERY),
        }),
        "php" => Some(LanguageSupport {
            language: php::language(),
            highlight_query: php::HIGHLIGHT_QUERY,
            injection_query: Some(php::INJECTION_QUERY),
        }),
        "python" => Some(LanguageSupport {
            language: python::language(),
            highlight_query: python::HIGHLIGHT_QUERY,
            injection_query: None,
        }),
        "ruby" => Some(LanguageSupport {
            language: ruby::language(),
            highlight_query: ruby::HIGHLIGHT_QUERY,
            injection_query: None,
        }),
        "rust" => Some(LanguageSupport {
            language: rust::language(),
            highlight_query: rust::HIGHLIGHT_QUERY,
            injection_query: None,
        }),
        "scala" => Some(LanguageSupport {
            language: scala::language(),
            highlight_query: scala::HIGHLIGHT_QUERY,
            injection_query: None,
        }),
        "svelte" => Some(LanguageSupport {
            language: svelte::language(),
            highlight_query: svelte::HIGHLIGHT_QUERY,
            injection_query: Some(svelte::INJECTION_QUERY),
        }),
        "swift" => Some(LanguageSupport {
            language: swift::language(),
            highlight_query: swift::HIGHLIGHT_QUERY,
            injection_query: None,
        }),
        "typescript" => Some(LanguageSupport {
            language: typescript::language(),
            highlight_query: typescript::HIGHLIGHT_QUERY,
            injection_query: None,
        }),
        "xml" => Some(LanguageSupport {
            language: xml::language(),
            highlight_query: xml::HIGHLIGHT_QUERY,
            injection_query: None,
        }),
        "yaml" => Some(LanguageSupport {
            language: yaml::language(),
            highlight_query: yaml::HIGHLIGHT_QUERY,
            injection_query: None,
        }),
        "zig" => Some(LanguageSupport {
            language: zig::language(),
            highlight_query: zig::HIGHLIGHT_QUERY,
            injection_query: None,
        }),
        _ => None,
    }
}

fn canonicalize(raw: &str) -> Option<&'static str> {
    let lower = raw.to_ascii_lowercase();
    match lower.as_str() {
        "astro" => Some("astro"),
        "sh" | "bash" | "zsh" | "shell" => Some("bash"),
        "cpp" | "cc" | "cxx" | "c++" | "hpp" | "hh" | "hxx" | "h++" | "tcc" | "inl" => Some("cpp"),
        "c" | "h" => Some("c"),
        "clj" | "cljs" | "cljc" | "edn" | "clojure" => Some("clojure"),
        "cs" | "csx" | "csharp" | "c#" => Some("csharp"),
        "css" | "scss" | "postcss" | "less" => Some("css"),
        "dart" => Some("dart"),
        "ex" | "exs" | "elixir" => Some("elixir"),
        "erl" | "hrl" | "es" | "escript" | "erlang" => Some("erlang"),
        "go" | "golang" => Some("go"),
        "hs" | "lhs" | "haskell" => Some("haskell"),
        "html" | "htm" => Some("html"),
        "java" => Some("java"),
        "js" | "jsx" | "mjs" | "cjs" | "javascript" => Some("javascript"),
        "json" | "jsonc" | "json5" => Some("json"),
        "kt" | "kts" | "kotlin" => Some("kotlin"),
        "lua" => Some("lua"),
        "md" | "markdown" => Some("markdown"),
        "nix" => Some("nix"),
        "php" | "php3" | "php4" | "php5" | "phtml" => Some("php"),
        "py" | "pyw" | "python" => Some("python"),
        "rb" | "rbw" | "rake" | "gemspec" | "ruby" => Some("ruby"),
        "rs" | "rust" => Some("rust"),
        "scala" | "sc" | "sbt" => Some("scala"),
        "svelte" => Some("svelte"),
        "swift" => Some("swift"),
        "ts" | "tsx" | "mts" | "cts" | "typescript" => Some("typescript"),
        "xml" | "svg" | "xsl" | "xslt" => Some("xml"),
        "yaml" | "yml" => Some("yaml"),
        "zig" => Some("zig"),
        _ => None,
    }
}