diff options
Diffstat (limited to 'lua/lazy-like-loader.lua')
| -rw-r--r-- | lua/lazy-like-loader.lua | 70 |
1 files changed, 70 insertions, 0 deletions
diff --git a/lua/lazy-like-loader.lua b/lua/lazy-like-loader.lua new file mode 100644 index 0000000..d17c91e --- /dev/null +++ b/lua/lazy-like-loader.lua @@ -0,0 +1,70 @@ +local M = { + package = nil, + packAddMissing = true, +} + +-- fancy plugin loader +function require_plugin(moduleName, source, setup, loadFn) + local ok, mod = pcall(require, moduleName) + if not ok then + if M.packAddMissing then + if not source then + vim.notify("Failed to load plugin module without source " .. moduleName, vim.log.levels.ERROR) + return + end + -- TODO track and do these all at once + vim.pack.add { source } + end + ok, mod = pcall(require, moduleName) + if not ok then + vim.notify(mod, vim.log.levels.ERROR) + return + end + end + if setup and mod.setup then + mod.setup(setup == true and {} or setup) + end + if loadFn then + loadFn() + end +end + +-- helper for handling dependencies and parsing module +function require_plugin_from_module(mod) + -- mod == true means it returned nothing + if mod == true or mod.enabled == false then + return + end + for _, dMod in ipairs(mod.dependencies or {}) do + require_plugin_from_module(dMod) + end + require_plugin(mod.moduleName or mod[1], mod.source or mod[2], mod.setup, mod.loadFn) + for _, dMod in ipairs(mod.dependents or {}) do + require_plugin_from_module(dMod) + end +end + +-- setup +local setup = function(opts) + -- handle missing opts + if not opts or not opts.package then + vim.notify("lazy-like-loader.setup invoked without required options ({ package = '' })", vim.log.levels.ERROR) + end + + -- handle opts + for k, v in pairs(opts) do + M[k] = v + end + + -- loop over plugins + local pluginsPath = vim.fn.stdpath("config") .. "/lua/" .. M.package:gsub("%.", "/") + for _, f in ipairs(vim.fn.glob(pluginsPath .. "/*.lua", false, true)) do + local name = vim.fn.fnamemodify(f, ":t:r") + local modName = M.package .. "." .. name + require_plugin_from_module(require(modName)) + end +end + +return { + setup = setup +} |
