Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
74 changes: 28 additions & 46 deletions lua/vectorcode/jobrunner/cmd.lua
Original file line number Diff line number Diff line change
@@ -1,8 +1,7 @@
---@type VectorCode.JobRunner
local runner = {}

local Job = require("plenary.job")
---@type {integer: Job}
---@type table<integer, vim.SystemObj>
local jobs = {}
local logger = require("vectorcode.config").logger

Expand All @@ -15,44 +14,30 @@ function runner.run_async(args, callback, bufnr)
logger.debug(
("cmd jobrunner for buffer %s args: %s"):format(bufnr, vim.inspect(args))
)
---@diagnostic disable-next-line: missing-fields
local job = Job:new({
command = require("vectorcode.config").get_user_config().cli_cmds.vectorcode,
args = args,
on_exit = function(self, code, signal)
jobs[self.pid] = nil
local result = self:result()
logger.debug(result)
local ok, decoded = pcall(vim.json.decode, table.concat(result, ""))
if callback ~= nil then
if ok then
callback(decoded or {}, self:stderr_result(), code, signal)
if vim.islist(result) then
logger.debug(
"cmd jobrunner result:\n",
vim.tbl_map(function(item)
if type(item) == "table" then
item.document = nil
item.chunk = nil
end
return item
end, vim.deepcopy(result))
)
end
else
callback({ result }, self:stderr_result(), code, signal)
logger.warn("cmd runner: failed to decode result:\n", result)
end
end
end,
})
local ok = pcall(job.start, job)
if ok then
jobs[job.pid] = job
return tonumber(job.pid)
else
logger.error("Failed to start job.")
end

table.insert(
args,
1,
require("vectorcode.config").get_user_config().cli_cmds.vectorcode
)

---@type vim.SystemObj?
local job
job = vim.system(args, {}, function(out)
if job and job.pid then
jobs[job.pid] = job
end
local stdout = out.stdout or "{}"
if stdout == "" then
stdout = "{}"
end
local _, decoded = pcall(vim.json.decode, stdout, { object = true, array = true })
if type(callback) == "function" then
callback(decoded or {}, out.stderr, out.code, out.signal)
end
end)
jobs[job.pid] = job
return tonumber(job.pid)
end

function runner.run(args, timeout_ms, bufnr)
Expand All @@ -66,11 +51,8 @@ function runner.run(args, timeout_ms, bufnr)
code = e_code
signal = s
end, bufnr)
if pid ~= nil then
vim.wait(timeout_ms, function()
return res ~= nil or err ~= nil
end)
jobs[pid] = nil
if pid ~= nil and jobs[pid] ~= nil then
jobs[pid]:wait(timeout_ms)
end
return res or {}, err, code, signal
end
Expand All @@ -82,7 +64,7 @@ end
function runner.stop_job(job_handle)
local job = jobs[job_handle]
if job ~= nil then
job:shutdown(1, 15)
job:kill(15)
end
end

Expand Down
Loading