diff options
Diffstat (limited to 'lua')
| -rw-r--r-- | lua/mason-registry/init.lua | 2 | ||||
| -rw-r--r-- | lua/mason-registry/sources/file.lua | 4 | ||||
| -rw-r--r-- | lua/mason-registry/sources/lua.lua | 53 |
3 files changed, 36 insertions, 23 deletions
diff --git a/lua/mason-registry/init.lua b/lua/mason-registry/init.lua index b129380c..713335f0 100644 --- a/lua/mason-registry/init.lua +++ b/lua/mason-registry/init.lua @@ -119,9 +119,11 @@ function Registry.update(callback) Registry:emit("update:progress", finished, all) end) :on_success(function(updated_registries) + log.fmt_debug("Successfully updated %d registries.", #updated_registries) Registry:emit("update:success", updated_registries) end) :on_failure(function(errors) + log.error("Failed to update registries.", errors) Registry:emit("update:failed", errors) end) :get_or_throw() diff --git a/lua/mason-registry/sources/file.lua b/lua/mason-registry/sources/file.lua index 84566479..d81fcc9c 100644 --- a/lua/mason-registry/sources/file.lua +++ b/lua/mason-registry/sources/file.lua @@ -1,8 +1,6 @@ -local Optional = require "mason-core.optional" local Result = require "mason-core.result" local _ = require "mason-core.functional" local a = require "mason-core.async" -local async_control = require "mason-core.async.control" local async_uv = require "mason-core.async.uv" local fs = require "mason-core.fs" local log = require "mason-core.log" @@ -11,8 +9,6 @@ local process = require "mason-core.process" local spawn = require "mason-core.spawn" local util = require "mason-registry.sources.util" -local Channel = async_control.Channel - ---@class FileRegistrySourceSpec ---@field id string ---@field path string diff --git a/lua/mason-registry/sources/lua.lua b/lua/mason-registry/sources/lua.lua index 7fae54fe..e2144a83 100644 --- a/lua/mason-registry/sources/lua.lua +++ b/lua/mason-registry/sources/lua.lua @@ -1,7 +1,6 @@ -local Optional = require "mason-core.optional" local Result = require "mason-core.result" local _ = require "mason-core.functional" -local log = require "mason-core.log" +local util = require "mason-registry.sources.util" ---@class LuaRegistrySourceSpec ---@field id string @@ -9,6 +8,7 @@ local log = require "mason-core.log" ---@class LuaRegistrySource : RegistrySource ---@field private spec LuaRegistrySourceSpec +---@field buffer { specs: RegistryPackageSpec[], instances: table<string, Package> }? local LuaRegistrySource = {} LuaRegistrySource.__index = LuaRegistrySource @@ -25,37 +25,52 @@ end ---@param pkg_name string ---@return Package? function LuaRegistrySource:get_package(pkg_name) - local index = require(self.spec.mod) - if index[pkg_name] then - local ok, mod = pcall(require, index[pkg_name]) - if ok then - return mod - else - log.fmt_warn("Unable to load %s from %s: %s", pkg_name, self, mod) - end - end + return self:get_buffer().instances[pkg_name] +end + +---@param specs RegistryPackageSpec[] +function LuaRegistrySource:reload(specs) + self.buffer = _.assoc("specs", specs, self.buffer or {}) + self.buffer.instances = _.compose( + _.index_by(_.prop "name"), + _.map(util.hydrate_package(self.buffer.instances or {})) + )(self:get_all_package_specs()) + return self.buffer end function LuaRegistrySource:install() - return Result.pcall(require, self.spec.mod) + return Result.try(function(try) + local index = try(Result.pcall(require, self.spec.mod)) + ---@type RegistryPackageSpec[] + local specs = {} + + for _, mod in pairs(index) do + table.insert(specs, try(Result.pcall(require, mod))) + end + + try(Result.pcall(self.reload, self, specs)) + end) end ---@return string[] function LuaRegistrySource:get_all_package_names() - local index = require(self.spec.mod) - return vim.tbl_keys(index) + return _.map(_.prop "name", self:get_all_package_specs()) end ---@return RegistryPackageSpec[] function LuaRegistrySource:get_all_package_specs() - return _.filter_map(function(name) - return Optional.of_nilable(self:get_package(name)):map(_.prop "spec") - end, self:get_all_package_names()) + return _.filter_map(util.map_registry_spec, self:get_buffer().specs) +end + +function LuaRegistrySource:get_buffer() + return self.buffer or { + specs = {}, + instances = {}, + } end function LuaRegistrySource:is_installed() - local ok = pcall(require, self.spec.mod) - return ok + return self.buffer ~= nil end function LuaRegistrySource:get_display_name() |
