diff options
Diffstat (limited to 'lua/mason-core/installer/context/InstallContextSpawn.lua')
| -rw-r--r-- | lua/mason-core/installer/context/InstallContextSpawn.lua | 52 |
1 files changed, 52 insertions, 0 deletions
diff --git a/lua/mason-core/installer/context/InstallContextSpawn.lua b/lua/mason-core/installer/context/InstallContextSpawn.lua new file mode 100644 index 00000000..f2ce8df2 --- /dev/null +++ b/lua/mason-core/installer/context/InstallContextSpawn.lua @@ -0,0 +1,52 @@ +local spawn = require "mason-core.spawn" + +---@class InstallContextSpawn +---@field strict_mode boolean Whether spawn failures should raise an exception rather then return a Result. +---@field private cwd InstallContextCwd +---@field private handle InstallHandle +---@field [string] async fun(opts: SpawnArgs): Result +local InstallContextSpawn = {} + +---@param handle InstallHandle +---@param cwd InstallContextCwd +---@param strict_mode boolean +function InstallContextSpawn:new(handle, cwd, strict_mode) + ---@type InstallContextSpawn + local instance = {} + setmetatable(instance, self) + instance.cwd = cwd + instance.handle = handle + instance.strict_mode = strict_mode + return instance +end + +---@param cmd string +function InstallContextSpawn:__index(cmd) + ---@param args JobSpawnOpts + return function(args) + args.cwd = args.cwd or self.cwd:get() + args.stdio_sink = args.stdio_sink or self.handle.stdio.sink + local on_spawn = args.on_spawn + local captured_handle + args.on_spawn = function(handle, stdio, pid, ...) + captured_handle = handle + self.handle:register_spawn_handle(handle, pid, cmd, spawn._flatten_cmd_args(args)) + if on_spawn then + on_spawn(handle, stdio, pid, ...) + end + end + local function pop_spawn_stack() + if captured_handle then + self.handle:deregister_spawn_handle(captured_handle) + end + end + local result = spawn[cmd](args):on_success(pop_spawn_stack):on_failure(pop_spawn_stack) + if self.strict_mode then + return result:get_or_throw() + else + return result + end + end +end + +return InstallContextSpawn |
