aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorWilliam Boman <william@redwill.se>2025-02-16 18:51:43 +0100
committerWilliam Boman <william@redwill.se>2025-02-19 12:15:49 +0100
commite13d54a97bb95ec0b0826e13e5886fe9790f04df (patch)
treecd939880e40468fd4e94de2c392d3a5ba743ec16
parentchore: remove unnecessary vim.schedule and nvim_err_writeln (diff)
downloadmason-e13d54a97bb95ec0b0826e13e5886fe9790f04df.tar
mason-e13d54a97bb95ec0b0826e13e5886fe9790f04df.tar.gz
mason-e13d54a97bb95ec0b0826e13e5886fe9790f04df.tar.bz2
mason-e13d54a97bb95ec0b0826e13e5886fe9790f04df.tar.lz
mason-e13d54a97bb95ec0b0826e13e5886fe9790f04df.tar.xz
mason-e13d54a97bb95ec0b0826e13e5886fe9790f04df.tar.zst
mason-e13d54a97bb95ec0b0826e13e5886fe9790f04df.zip
feat(context): add ctx:await()
-rw-r--r--lua/mason-core/installer/context/init.lua6
-rw-r--r--tests/mason-core/installer/context_spec.lua37
2 files changed, 43 insertions, 0 deletions
diff --git a/lua/mason-core/installer/context/init.lua b/lua/mason-core/installer/context/init.lua
index 44490782..b22c562b 100644
--- a/lua/mason-core/installer/context/init.lua
+++ b/lua/mason-core/installer/context/init.lua
@@ -109,6 +109,12 @@ function InstallContext:chdir(rel_path, fn)
end
end
+---@async
+---@param fn fun(resolve: fun(result: any), reject: fun(error: any))
+function InstallContext:await(fn)
+ return a.wait(fn)
+end
+
---@param new_executable_rel_path string Relative path to the executable file to create.
---@param script_rel_path string Relative path to the Node.js script.
function InstallContext:write_node_exec_wrapper(new_executable_rel_path, script_rel_path)
diff --git a/tests/mason-core/installer/context_spec.lua b/tests/mason-core/installer/context_spec.lua
index d753c05f..ad469e08 100644
--- a/tests/mason-core/installer/context_spec.lua
+++ b/tests/mason-core/installer/context_spec.lua
@@ -1,7 +1,9 @@
+local a = require "mason-core.async"
local match = require "luassert.match"
local path = require "mason-core.path"
local pypi = require "mason-core.installer.managers.pypi"
local registry = require "mason-registry"
+local spy = require "luassert.spy"
local stub = require "luassert.stub"
local test_helpers = require "mason-test.helpers"
@@ -247,4 +249,39 @@ cmd.exe /C echo %GREETING% %*]]
assert.equals([[Cannot write PHP exec wrapper for path "some/obscure/path/cli.php" as it doesn't exist.]], err)
assert.spy(ctx.write_shell_exec_wrapper).was_called(0)
end)
+
+ it("should await callback-style async function", function()
+ local value = a.run_blocking(function()
+ local ctx = test_helpers.create_context()
+ return ctx:execute(function()
+ return ctx:await(function(resolve, reject)
+ vim.defer_fn(function()
+ resolve "Value!"
+ end, 500)
+ end)
+ end)
+ end)
+
+ assert.equals("Value!", value)
+ end)
+
+ it("should propagate errors in callback-style async function", function()
+ local guard = spy.new()
+ local error = assert.has_error(function()
+ a.run_blocking(function()
+ local ctx = test_helpers.create_context()
+ return ctx:execute(function()
+ ctx:await(function(resolve, reject)
+ vim.defer_fn(function()
+ reject "Error!"
+ end, 500)
+ end)
+ guard()
+ end)
+ end)
+ end)
+
+ assert.equals("Error!", error)
+ assert.spy(guard).was_called(0)
+ end)
end)