Skip to main content

babyrite/
utils.rs

1//! Utility functions for babyrite.
2
3/// Returns the language identifier for syntax highlighting based on file extension.
4///
5/// Used for code block language hints when expanding GitHub permalinks.
6pub fn language_from_extension(extension: &str) -> &str {
7    match extension.to_lowercase().as_str() {
8        "rs" => "rust",
9        "py" => "python",
10        "js" => "javascript",
11        "ts" => "typescript",
12        "jsx" => "jsx",
13        "tsx" => "tsx",
14        "rb" => "ruby",
15        "go" => "go",
16        "java" => "java",
17        "kt" | "kts" => "kotlin",
18        "c" => "c",
19        "h" => "c",
20        "cpp" | "cc" | "cxx" => "cpp",
21        "hpp" | "hxx" => "cpp",
22        "cs" => "csharp",
23        "swift" => "swift",
24        "php" => "php",
25        "scala" => "scala",
26        "sh" | "bash" | "zsh" | "fish" => "bash",
27        "ps1" => "powershell",
28        "html" | "htm" => "html",
29        "css" => "css",
30        "scss" => "scss",
31        "sass" => "sass",
32        "less" => "less",
33        "json" => "json",
34        "yaml" | "yml" => "yaml",
35        "toml" => "toml",
36        "xml" => "xml",
37        "sql" => "sql",
38        "md" | "markdown" => "markdown",
39        "dockerfile" => "dockerfile",
40        "lua" => "lua",
41        "r" => "r",
42        "dart" => "dart",
43        "zig" => "zig",
44        "nim" => "nim",
45        "ex" | "exs" => "elixir",
46        "erl" | "hrl" => "erlang",
47        "hs" => "haskell",
48        "ml" | "mli" => "ocaml",
49        "clj" | "cljs" => "clojure",
50        "tf" => "hcl",
51        "vue" => "vue",
52        "svelte" => "svelte",
53        "graphql" | "gql" => "graphql",
54        "proto" => "protobuf",
55        "makefile" | "mk" => "makefile",
56        _ => extension,
57    }
58}
59
60#[cfg(test)]
61mod tests {
62    use super::*;
63
64    #[test]
65    fn known_extensions() {
66        assert_eq!(language_from_extension("rs"), "rust");
67        assert_eq!(language_from_extension("py"), "python");
68        assert_eq!(language_from_extension("js"), "javascript");
69        assert_eq!(language_from_extension("ts"), "typescript");
70        assert_eq!(language_from_extension("go"), "go");
71        assert_eq!(language_from_extension("java"), "java");
72        assert_eq!(language_from_extension("cpp"), "cpp");
73        assert_eq!(language_from_extension("cc"), "cpp");
74        assert_eq!(language_from_extension("c"), "c");
75        assert_eq!(language_from_extension("h"), "c");
76        assert_eq!(language_from_extension("hpp"), "cpp");
77        assert_eq!(language_from_extension("cs"), "csharp");
78        assert_eq!(language_from_extension("rb"), "ruby");
79        assert_eq!(language_from_extension("kt"), "kotlin");
80        assert_eq!(language_from_extension("kts"), "kotlin");
81        assert_eq!(language_from_extension("sh"), "bash");
82        assert_eq!(language_from_extension("bash"), "bash");
83        assert_eq!(language_from_extension("zsh"), "bash");
84        assert_eq!(language_from_extension("fish"), "bash");
85        assert_eq!(language_from_extension("yaml"), "yaml");
86        assert_eq!(language_from_extension("yml"), "yaml");
87        assert_eq!(language_from_extension("json"), "json");
88        assert_eq!(language_from_extension("toml"), "toml");
89        assert_eq!(language_from_extension("md"), "markdown");
90        assert_eq!(language_from_extension("ex"), "elixir");
91        assert_eq!(language_from_extension("exs"), "elixir");
92        assert_eq!(language_from_extension("hs"), "haskell");
93        assert_eq!(language_from_extension("tf"), "hcl");
94        assert_eq!(language_from_extension("vue"), "vue");
95        assert_eq!(language_from_extension("svelte"), "svelte");
96        assert_eq!(language_from_extension("proto"), "protobuf");
97        assert_eq!(language_from_extension("graphql"), "graphql");
98        assert_eq!(language_from_extension("gql"), "graphql");
99    }
100
101    #[test]
102    fn case_insensitive() {
103        assert_eq!(language_from_extension("RS"), "rust");
104        assert_eq!(language_from_extension("Py"), "python");
105        assert_eq!(language_from_extension("JS"), "javascript");
106    }
107
108    #[test]
109    fn unknown_extension_returns_as_is() {
110        assert_eq!(language_from_extension("xyz"), "xyz");
111        assert_eq!(language_from_extension("foo"), "foo");
112    }
113
114    #[test]
115    fn extensionless_filenames() {
116        assert_eq!(language_from_extension("Dockerfile"), "dockerfile");
117        assert_eq!(language_from_extension("dockerfile"), "dockerfile");
118        assert_eq!(language_from_extension("Makefile"), "makefile");
119        assert_eq!(language_from_extension("makefile"), "makefile");
120    }
121}