aboutsummaryrefslogtreecommitdiffstats
path: root/lua
diff options
context:
space:
mode:
authorWilliam Boman <william@redwill.se>2023-03-05 02:45:00 +0100
committerGitHub <noreply@github.com>2023-03-05 02:45:00 +0100
commit5887ce1c8031fb15e5cdcf43999db01b19536d6e (patch)
tree9cb37a72e28e61d84e5ffa7fdbef33ef394b1531 /lua
parentfeat(InstallContext): add strict_mode flag (#1055) (diff)
downloadmason-5887ce1c8031fb15e5cdcf43999db01b19536d6e.tar
mason-5887ce1c8031fb15e5cdcf43999db01b19536d6e.tar.gz
mason-5887ce1c8031fb15e5cdcf43999db01b19536d6e.tar.bz2
mason-5887ce1c8031fb15e5cdcf43999db01b19536d6e.tar.lz
mason-5887ce1c8031fb15e5cdcf43999db01b19536d6e.tar.xz
mason-5887ce1c8031fb15e5cdcf43999db01b19536d6e.tar.zst
mason-5887ce1c8031fb15e5cdcf43999db01b19536d6e.zip
refactor(expr): better handling of nil values (#1056)
Diffstat (limited to 'lua')
-rw-r--r--lua/mason-core/installer/registry/expr.lua26
1 files changed, 10 insertions, 16 deletions
diff --git a/lua/mason-core/installer/registry/expr.lua b/lua/mason-core/installer/registry/expr.lua
index c6a6aafe..1fdeeee8 100644
--- a/lua/mason-core/installer/registry/expr.lua
+++ b/lua/mason-core/installer/registry/expr.lua
@@ -37,36 +37,30 @@ local function shallow_clone(tbl)
return res
end
+---@param expr string
+---@param ctx table<string, any>
+local function eval(expr, ctx)
+ return setfenv(assert(loadstring("return " .. expr), ("Failed to parse expression: %q"):format(expr)), ctx)()
+end
+
---@param str string
---@param ctx table<string, any>
function M.interpolate(str, ctx)
ctx = shallow_clone(ctx)
+ setmetatable(ctx, { __index = FILTERS })
return Result.pcall(function()
- setmetatable(ctx, { __index = FILTERS })
return _.gsub("{{([^}]+)}}", function(expr)
local components = parse_expr(expr)
- local value = assert(
- setfenv(
- assert(
- loadstring("return " .. components.value_expr),
- ("Failed to parse value: %q"):format(components.value_expr)
- ),
- ctx
- )(),
- ("Value is nil: %q"):format(components.value_expr)
- )
+ local value = eval(components.value_expr, ctx)
local filters = _.map(function(filter_expr)
- local filter = setfenv(
- assert(loadstring("return " .. filter_expr), ("Failed to parse filter: %q"):format(filter_expr)),
- ctx
- )()
+ local filter = eval(filter_expr, ctx)
assert(type(filter) == "function", ("Invalid filter expression: %q"):format(filter_expr))
return filter
end, components.filters)
- return _.reduce(_.apply_to, value, filters)
+ return _.reduce(_.apply_to, value, filters) or ""
end, str)
end)
end