aboutsummaryrefslogtreecommitdiffstats
path: root/lua/mason-registry/init.lua
diff options
context:
space:
mode:
authorWilliam Boman <william@redwill.se>2022-07-08 17:36:10 +0200
committerGitHub <noreply@github.com>2022-07-08 17:36:10 +0200
commit8cad2361dd63c67d95acf9f79321927b03843959 (patch)
tree951599a91b56cc5be5220fe645e0c5323d21ae83 /lua/mason-registry/init.lua
parentfix(ui): read from correct path in the receipt to gather linked bins (#26) (diff)
downloadmason-8cad2361dd63c67d95acf9f79321927b03843959.tar
mason-8cad2361dd63c67d95acf9f79321927b03843959.tar.gz
mason-8cad2361dd63c67d95acf9f79321927b03843959.tar.bz2
mason-8cad2361dd63c67d95acf9f79321927b03843959.tar.lz
mason-8cad2361dd63c67d95acf9f79321927b03843959.tar.xz
mason-8cad2361dd63c67d95acf9f79321927b03843959.tar.zst
mason-8cad2361dd63c67d95acf9f79321927b03843959.zip
refactor: move packages to mason-registry (#27)
Diffstat (limited to 'lua/mason-registry/init.lua')
-rw-r--r--lua/mason-registry/init.lua90
1 files changed, 90 insertions, 0 deletions
diff --git a/lua/mason-registry/init.lua b/lua/mason-registry/init.lua
new file mode 100644
index 00000000..1c87735e
--- /dev/null
+++ b/lua/mason-registry/init.lua
@@ -0,0 +1,90 @@
+local log = require "mason.log"
+local fs = require "mason.core.fs"
+local _ = require "mason.core.functional"
+local Optional = require "mason.core.optional"
+local path = require "mason.core.path"
+local EventEmitter = require "mason.core.EventEmitter"
+
+local index = require "mason-registry.index"
+
+local M = setmetatable({}, { __index = EventEmitter })
+EventEmitter.init(M)
+
+local scan_install_root
+
+do
+ ---@type table<string, true>
+ local cached_dirs
+
+ local get_directories = _.compose(
+ _.set_of,
+ _.filter_map(function(entry)
+ if entry.type == "directory" and index[entry.name] then
+ return Optional.of(entry.name)
+ else
+ return Optional.empty()
+ end
+ end)
+ )
+
+ ---@return table<string, true>
+ scan_install_root = function()
+ if cached_dirs then
+ return cached_dirs
+ end
+ log.trace "Scanning installation root dir"
+ ---@type string[]
+ local ok, entries = pcall(fs.sync.readdir, path.package_prefix())
+ if not ok then
+ log.debug("Failed to scan installation root dir", entries)
+ -- presume installation root dir has not been created yet (i.e., no packages installed)
+ return {}
+ end
+ cached_dirs = get_directories(entries)
+ vim.schedule(function()
+ cached_dirs = nil
+ end)
+ log.trace("Resolved installation root dirs", cached_dirs)
+ return cached_dirs
+ end
+end
+
+---@param package_name string
+function M.is_installed(package_name)
+ return scan_install_root()[package_name] == true
+end
+
+---@param package_name string
+---@return Package
+function M.get_package(package_name)
+ local ok, pkg = pcall(require, index[package_name])
+ if not ok then
+ log.error(pkg)
+ error(("Cannot find package %q."):format(package_name))
+ end
+ return pkg
+end
+
+local get_packages = _.map(M.get_package)
+
+---@return string[]
+function M.get_installed_package_names()
+ return _.keys(scan_install_root())
+end
+
+---@return Package[]
+function M.get_installed_packages()
+ return get_packages(M.get_installed_package_names())
+end
+
+---@return string[]
+function M.get_all_package_names()
+ return _.keys(index)
+end
+
+---@return Package[]
+function M.get_all_packages()
+ return get_packages(M.get_all_package_names())
+end
+
+return M