Skip to main content

strop_core/
languages.rs

1//! The canonical language metadata catalog (0051 §3): ONE in-repo table
2//! mapping file extensions to language names and back. The LSP registry
3//! and the query compiler both consume this — there is no second table.
4
5/// One language family: canonical name, filename extensions, documented
6/// value aliases (`rs` reads as `rust`).
7pub struct Language {
8    pub name: &'static str,
9    pub extensions: &'static [&'static str],
10    pub aliases: &'static [&'static str],
11}
12
13pub const LANGUAGES: &[Language] = &[
14    Language {
15        name: "rust",
16        extensions: &["rs"],
17        aliases: &["rs"],
18    },
19    Language {
20        name: "c",
21        extensions: &["c", "h"],
22        aliases: &[],
23    },
24    Language {
25        name: "cpp",
26        extensions: &["cpp", "cc", "cxx", "hpp", "hh"],
27        aliases: &["c++"],
28    },
29    Language {
30        name: "python",
31        extensions: &["py", "pyi"],
32        aliases: &["py"],
33    },
34    Language {
35        name: "go",
36        extensions: &["go"],
37        aliases: &["golang"],
38    },
39    Language {
40        name: "javascript",
41        extensions: &["js", "jsx", "mjs", "cjs"],
42        aliases: &["js"],
43    },
44    Language {
45        name: "typescript",
46        extensions: &["ts", "tsx"],
47        aliases: &["ts"],
48    },
49    Language {
50        name: "json",
51        extensions: &["json"],
52        aliases: &[],
53    },
54    Language {
55        name: "shellscript",
56        extensions: &["sh", "bash"],
57        aliases: &["sh", "bash", "shell"],
58    },
59];
60
61/// Language name for a bare extension (no dot).
62pub fn language_for_extension_name(ext: &str) -> Option<&'static str> {
63    LANGUAGES
64        .iter()
65        .find(|language| language.extensions.contains(&ext))
66        .map(|language| language.name)
67}
68
69/// Language name for a dotted extension (`.rs`).
70pub fn language_for_extension(ext_with_dot: &str) -> Option<&'static str> {
71    language_for_extension_name(ext_with_dot.strip_prefix('.')?)
72}
73
74/// A language's extensions, by canonical name or documented alias.
75pub fn extensions_for_language(name_or_alias: &str) -> Option<&'static [&'static str]> {
76    LANGUAGES
77        .iter()
78        .find(|language| {
79            language.name == name_or_alias || language.aliases.contains(&name_or_alias)
80        })
81        .map(|language| language.extensions)
82}
83
84/// Every canonical language name (suggestions/discovery).
85pub fn language_names() -> impl Iterator<Item = &'static str> {
86    LANGUAGES.iter().map(|language| language.name)
87}