@ 261105.2
current
---@diagnostic disable-next-line: unbalanced-assignments
---@type string[], string[], table<string, boolean>
local exported_modules, lazyloaded_modules, exported_wapi = ...

local buf = {}
local write = function(s) buf[#buf + 1] = s end
local flush = function()
  assert(io.open("lua/fzf-lua/types.lua", "w")):write(table.concat(buf, ""))
  buf = {}
end

local mark = vim.pesc("---GENERATED from `make gen`")
for line in io.lines("lua/fzf-lua/types.lua") do
  write(line .. "\n")
  if line:match(mark) then
    break
  end
end
-- generate api typings
write("\n")
for _, v in vim.spairs(exported_modules) do
  write(([[FzfLua.%s = require("fzf-lua.%s")]] .. "\n"):format(v, v))
end
write("\n")
for k, v in vim.spairs(lazyloaded_modules) do
  write(([[FzfLua.%s = require(%q).%s]] .. "\n"):format(k, v[1], v[2])) ---@diagnostic disable-line: undefined-field
end
write("\n")

local obj = vim.system({ "sh", "-c", [[
  emmylua_doc_cli lua/fzf-lua/ --output-format json --output stdout | jq '.types[] | select(.name == "fzf-lua.Win")'
]] }):wait()

---@type EmmyDocTypeClass
local res = vim.json.decode(obj.stdout or "")

---@param m EmmyDocTypeMember
local write_member = function(m)
  if not exported_wapi[m.name] then return end
  write("---@field " .. m.name .. " ")
  write(m.is_async and "async" or "")
  write("fun(")
  ---@diagnostic disable-next-line: redundant-parameter, call-non-callable
  local params = vim.iter(m.params --[[@as table<integer, EmmyDocParam>]])
  ---@diagnostic disable-next-line: access-invisible
  local p1 = params:next()
  if p1 then write(("%s: %s"):format(p1.name, p1.typ)) end
  ---@diagnostic disable-next-line: access-invisible
  params:each(function(p) write((", %s: %s"):format(p.name, p.typ)) end)
  write(")")

  ---@diagnostic disable-next-line: redundant-parameter, call-non-callable
  local returns = vim.iter(m.returns --[[@as table<integer, EmmyDocReturn>]])
  ---@diagnostic disable-next-line: access-invisible
  local r1 = returns:next()
  if r1 then write((": " .. r1.typ)) end
  ---@diagnostic disable-next-line: access-invisible
  returns:each(function(r) write(", " .. r.typ) end)
  write("\n")
end

write("---@class fzf-lua.win.api: fzf-lua.Win\n")
---@diagnostic disable-next-line: redundant-parameter, call-non-callable, access-invisible
vim.iter(res.members):each(write_member)

flush()