aboutsummaryrefslogtreecommitdiffstats
path: root/lua/mason-core/installer/registry/expr.lua
diff options
context:
space:
mode:
authorWilliam Boman <william@redwill.se>2022-12-20 00:02:41 +0100
committerGitHub <noreply@github.com>2022-12-20 00:02:41 +0100
commitca77c845f71b669a3378c976d1f7cf729aee2614 (patch)
tree50ac0a18db05fa9fcff3a155c94c52150053ab66 /lua/mason-core/installer/registry/expr.lua
parentfeat(registry): add nil (#774) (diff)
downloadmason-ca77c845f71b669a3378c976d1f7cf729aee2614.tar
mason-ca77c845f71b669a3378c976d1f7cf729aee2614.tar.gz
mason-ca77c845f71b669a3378c976d1f7cf729aee2614.tar.bz2
mason-ca77c845f71b669a3378c976d1f7cf729aee2614.tar.lz
mason-ca77c845f71b669a3378c976d1f7cf729aee2614.tar.xz
mason-ca77c845f71b669a3378c976d1f7cf729aee2614.tar.zst
mason-ca77c845f71b669a3378c976d1f7cf729aee2614.zip
feat: add expr module (#775)
This is (soon) to be used when installing package definitions from https://github.com/mason-org/mason-registry/. See for example: https://github.com/mason-org/mason-registry/blob/7df69dd2a73efc3a08520552ca64597d1db5f4fb/packages/go-debug-adapter/package.yaml#L16
Diffstat (limited to 'lua/mason-core/installer/registry/expr.lua')
-rw-r--r--lua/mason-core/installer/registry/expr.lua44
1 files changed, 44 insertions, 0 deletions
diff --git a/lua/mason-core/installer/registry/expr.lua b/lua/mason-core/installer/registry/expr.lua
new file mode 100644
index 00000000..be704156
--- /dev/null
+++ b/lua/mason-core/installer/registry/expr.lua
@@ -0,0 +1,44 @@
+local _ = require "mason-core.functional"
+local string_funs = require "mason-core.functional.string"
+local Result = require "mason-core.result"
+
+local M = {}
+
+local parse_expr = _.compose(
+ _.apply_spec {
+ value_expr = _.head,
+ filters = _.drop(1),
+ },
+ _.filter(_.complement(_.equals "")),
+ _.map(_.trim),
+ _.split "|"
+)
+
+---@param str string
+---@param ctx table<string, any>
+function M.eval(str, ctx)
+ return Result.pcall(function()
+ return _.gsub("{{([^}]+)}}", function(expr)
+ local components = parse_expr(expr)
+ local value =
+ assert(ctx[components.value_expr], ("Unable to interpolate value: %q."):format(components.value_expr))
+ return _.reduce(
+ _.apply_to,
+ value,
+ _.map(function(filter_expr)
+ local filter = setfenv(
+ assert(
+ loadstring("return " .. filter_expr),
+ ("Failed to parse filter: %q."):format(filter_expr)
+ ),
+ string_funs
+ )()
+ assert(type(filter) == "function", ("Invalid filter expression: %q."):format(filter_expr))
+ return filter
+ end, components.filters)
+ )
+ end, str)
+ end)
+end
+
+return M