diff --git a/lua/vectorcode/jobrunner/cmd.lua b/lua/vectorcode/jobrunner/cmd.lua index 8a24eade..a525dac7 100644 --- a/lua/vectorcode/jobrunner/cmd.lua +++ b/lua/vectorcode/jobrunner/cmd.lua @@ -1,8 +1,7 @@ ---@type VectorCode.JobRunner local runner = {} -local Job = require("plenary.job") ----@type {integer: Job} +---@type table local jobs = {} local logger = require("vectorcode.config").logger @@ -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) @@ -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 @@ -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