diff options
| author | William Boman <william@redwill.se> | 2022-03-06 21:48:29 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2022-03-06 21:48:29 +0100 |
| commit | dc39ce90f99a77699317bd31d95ce970690a4624 (patch) | |
| tree | 901e89bacca9b0d370c694fcd5a88cf2e1ae768e /lua/nvim-lsp-installer/core/async/spawn.lua | |
| parent | fix(fetch): shift args to put callback arg last (diff) | |
| download | mason-dc39ce90f99a77699317bd31d95ce970690a4624.tar mason-dc39ce90f99a77699317bd31d95ce970690a4624.tar.gz mason-dc39ce90f99a77699317bd31d95ce970690a4624.tar.bz2 mason-dc39ce90f99a77699317bd31d95ce970690a4624.tar.lz mason-dc39ce90f99a77699317bd31d95ce970690a4624.tar.xz mason-dc39ce90f99a77699317bd31d95ce970690a4624.tar.zst mason-dc39ce90f99a77699317bd31d95ce970690a4624.zip | |
run server installation in async execution context (#525)
Diffstat (limited to 'lua/nvim-lsp-installer/core/async/spawn.lua')
| -rw-r--r-- | lua/nvim-lsp-installer/core/async/spawn.lua | 35 |
1 files changed, 31 insertions, 4 deletions
diff --git a/lua/nvim-lsp-installer/core/async/spawn.lua b/lua/nvim-lsp-installer/core/async/spawn.lua index e643f098..5fc7eee7 100644 --- a/lua/nvim-lsp-installer/core/async/spawn.lua +++ b/lua/nvim-lsp-installer/core/async/spawn.lua @@ -1,34 +1,61 @@ local a = require "nvim-lsp-installer.core.async" +local Result = require "nvim-lsp-installer.core.result" local process = require "nvim-lsp-installer.process" local platform = require "nvim-lsp-installer.platform" local async_spawn = a.promisify(process.spawn) +---@type Record<string, fun(opts: JobSpawnOpts): Result> local spawn = { aliases = { npm = platform.is_win and "npm.cmd" or "npm", }, } +local function Failure(err, cmd) + return Result.failure(setmetatable(err, { + __tostring = function() + return ("spawn: %s failed with exit code %d"):format(cmd, err.exit_code) + end, + })) +end + setmetatable(spawn, { __index = function(self, k) return function(args) - local stdio = process.in_memory_sink() local cmd_args = {} for i, arg in ipairs(args) do cmd_args[i] = arg end ---@type JobSpawnOpts local spawn_args = { - stdio_sink = stdio.sink, + stdio_sink = args.stdio_sink, cwd = args.cwd, env = args.env, args = cmd_args, } + + local stdio + if not spawn_args.stdio_sink then + stdio = process.in_memory_sink() + spawn_args.stdio_sink = stdio.sink + end + local cmd = self.aliases[k] or k local _, exit_code = async_spawn(cmd, spawn_args) - assert(exit_code == 0, ("%q exited with an error code: %d."):format(cmd, exit_code)) - return table.concat(stdio.buffers.stdout, ""), table.concat(stdio.buffers.stderr, "") + + if exit_code == 0 then + return Result.success { + stdout = stdio and table.concat(stdio.buffers.stdout, "") or nil, + stderr = stdio and table.concat(stdio.buffers.stderr, "") or nil, + } + else + return Failure({ + exit_code = exit_code, + stdout = stdio and table.concat(stdio.buffers.stdout, "") or nil, + stderr = stdio and table.concat(stdio.buffers.stderr, "") or nil, + }, cmd) + end end end, }) |
