diff options
| author | William Boman <william@redwill.se> | 2022-07-08 17:36:10 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2022-07-08 17:36:10 +0200 |
| commit | 8cad2361dd63c67d95acf9f79321927b03843959 (patch) | |
| tree | 951599a91b56cc5be5220fe645e0c5323d21ae83 /lua/mason-registry/init.lua | |
| parent | fix(ui): read from correct path in the receipt to gather linked bins (#26) (diff) | |
| download | mason-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.lua | 90 |
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 |
