aboutsummaryrefslogtreecommitdiff
path: root/generate_parsers.lua
blob: 816358c903092569dea73c58d25657e03f5b066f (plain)
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("});")