1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
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("});")
|