Skip to content

Commit

Permalink
feat: add api-linter
Browse files Browse the repository at this point in the history
  • Loading branch information
fredrikaverpil committed Sep 23, 2024
1 parent 968a35d commit fd2d074
Showing 1 changed file with 79 additions and 0 deletions.
79 changes: 79 additions & 0 deletions lua/lint/linters/api-linter.lua
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
local function find_file(filenames)
local found = vim.fs.find(function(name, path)
return vim.tbl_contains(filenames, name)
end, {
limit = 1,
type = "file",
path = ".",
})
return found[1]
end

local descriptor_filepath = os.tmpname()
local cleanup_descriptor = function()
os.remove(descriptor_filepath)
end

--- Function to set the `--descriptor-set-in` argument.
--- This requires the buf CLI, which will first build the descriptor file.
local function descriptor_set_in()
if vim.fn.executable("buf") == 0 then
error("buf CLI not found")
end

local buffer_parent_dir = vim.fn.expand("%:p:h")
local buf_filenames = { "buf.yaml", "buf.yml" }
local buf_config_filepath = find_file(buf_filenames, buffer_parent_dir)
if buf_config_filepath == nil then
error("Buf config file not found")
end
local buf_config_folderpath = vim.fn.fnamemodify(buf_config_filepath, ":h")
local buf_cmd = { "buf", "build", "-o", descriptor_filepath }
local buf_cmd_opts = { cwd = buf_config_folderpath }
local obj = vim.system(buf_cmd, buf_cmd_opts):wait()
if obj.code ~= 0 then
error("Command failed: " .. vim.inspect(buf_cmd) .. "\n" .. obj.stderr)
end
local descriptor_arg = "--descriptor-set-in=" .. descriptor_filepath
return descriptor_arg
end

return {
cmd = "api-linter",
stdin = false,
append_fname = true,
args = {
"--output-format=json",
"--disable-rule=core::0191",
descriptor_set_in,
},
stream = "stdout",
ignore_exitcode = true,
env = nil,
parser = function(output)
if output == "" then
return {}
end
local json_output = vim.json.decode(output)
local diagnostics = {}
if json_output == nil then
return diagnostics
end
for _, item in ipairs(json_output) do
for _, problem in ipairs(item.problems) do
table.insert(diagnostics, {
message = problem.message,
file = item.file,
code = problem.rule_id .. " " .. problem.rule_doc_uri,
severity = vim.diagnostic.severity.WARN,
lnum = problem.location.start_position.line_number - 1,
col = problem.location.start_position.column_number - 1,
end_lnum = problem.location.end_position.line_number - 1,
end_col = problem.location.end_position.column_number - 1,
})
end
end
cleanup_descriptor()
return diagnostics
end,
}

0 comments on commit fd2d074

Please sign in to comment.