---@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> = 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> = 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("});")