aboutsummaryrefslogtreecommitdiff
path: root/generate_parsers.lua
diff options
context:
space:
mode:
authordelta <darkussdelta@gmail.com>2025-08-26 00:57:02 +0200
committerdelta <darkussdelta@gmail.com>2025-08-26 00:58:09 +0200
commitcfd14e880023752bffe9a01d1781b54ceefa32ec (patch)
treecaf8bf8ef7cb966c9d06776bb75d02d11fe7eda7 /generate_parsers.lua
initial commit
Diffstat (limited to 'generate_parsers.lua')
-rw-r--r--generate_parsers.lua59
1 files changed, 59 insertions, 0 deletions
diff --git a/generate_parsers.lua b/generate_parsers.lua
new file mode 100644
index 0000000..816358c
--- /dev/null
+++ b/generate_parsers.lua
@@ -0,0 +1,59 @@
+---@type string
+local parsers_content = io.read("*a")
+---@type string
+local aliases = parsers_content:match("for ft, lang in pairs {(.-)} do")
+
+print([[
+pub static ALIASES: LazyLock<HashMap<&'static str, &'static str>> = LazyLock::new(|| {
+ HashMap::from([]])
+for k,v in aliases:gmatch("%[?\"?([^%s]-)\"?%]? = \"(.-)\",") do
+ print([[ ("]] .. k .. [[", "]] .. v .. [["),]])
+end
+print(" ])")
+print([[});
+]])
+
+local function crush(t1, t2)
+ for k,v in pairs(t2) do t1[k] = v end
+end
+
+local function quote(v)
+ return type(v) == "string" and [["]] .. v .. [["]] or v
+end
+
+local function opt(v)
+ return type(v) == "nil" and "None" or "Some(" .. quote(v) .. ")"
+end
+
+print([[pub static PARSERS: LazyLock<HashMap<&'static str, Parser>> = LazyLock::new(|| {
+ HashMap::from([]])
+for lang, _data in parsers_content:gmatch("list%.(%w+)%s-=%s-{.-install_info%s-=%s(%b{})") do
+ local data = load("return " .. _data)()
+ local info = {
+ url = "",
+ files = {},
+ generate_requires_npm = false,
+ requires_generate_from_grammar = false,
+ use_makefile = false,
+ }
+
+ crush(info, data)
+ local files_str = ""
+ for _,v in ipairs(info.files) do
+ files_str = files_str .. "\"" .. v .. "\"" .. (next(info.files, _) ~= nil and "," or "")
+ end
+
+ print(" (" .. quote(lang) .. ", Parser {")
+ print(" url: " .. quote(info.url) .. ",")
+ print(" branch: " .. opt(info.branch) .. ",")
+ print(" revision: " .. opt(info.revision) .. ",")
+ print(" files: &[".. files_str .. "],")
+ print(" generate_requires_npm: " .. tostring(info.generate_requires_npm) .. ",")
+ print(" requires_generate_from_grammar: " .. tostring(info.requires_generate_from_grammar) .. ",")
+ print(" location: " .. opt(info.location) .. ",")
+ print(" use_makefile: " .. tostring(info.use_makefile) .. ",")
+ print(" cxx_standard: " .. opt(info.cxx_standard))
+ print(" }),")
+end
+print(" ])")
+print("});")