168 lines
3.1 KiB
Lua
168 lines
3.1 KiB
Lua
local deps = require 'sloth-flake.deps'
|
|
local priv = {
|
|
is = {
|
|
init = {},
|
|
import = {},
|
|
config = {},
|
|
shim = {},
|
|
},
|
|
}
|
|
|
|
local M = {}
|
|
|
|
function M.get(name)
|
|
return deps[name]
|
|
end
|
|
|
|
function M.init_non_lazy()
|
|
for _, dep in ipairs(M.non_lazy_deps()) do
|
|
M.init(dep.name)
|
|
end
|
|
end
|
|
|
|
function M.import_non_lazy()
|
|
for _, dep in ipairs(M.non_lazy_deps()) do
|
|
M.import(dep.name)
|
|
end
|
|
end
|
|
|
|
function M.config_non_lazy()
|
|
for _, dep in ipairs(M.non_lazy_deps()) do
|
|
M.config(dep.name)
|
|
end
|
|
end
|
|
|
|
function load_fn(type)
|
|
local function fn(name)
|
|
local dep = M.get(name)
|
|
if dep == nil then
|
|
-- TODO Handle missing deps
|
|
return
|
|
end
|
|
if priv.is[type][name] then
|
|
return
|
|
end
|
|
priv.is[type][name] = true
|
|
if dep[type] ~= nil then
|
|
for _, child in ipairs(dep.dependencies) do
|
|
fn(child)
|
|
end
|
|
dep[type]()
|
|
end
|
|
end
|
|
return fn
|
|
end
|
|
|
|
M.init = load_fn('init')
|
|
M.config = load_fn('config')
|
|
|
|
function M.import(name)
|
|
if M.is_imported(name) then
|
|
return
|
|
end
|
|
local plugin = M.get(name)
|
|
if plugin == nil then
|
|
-- TODO Handle missing deps
|
|
return
|
|
end
|
|
priv.is.import[name] = true
|
|
if plugin.lazy then
|
|
for _, dep in ipairs(plugin.dependencies) do
|
|
M.import(dep)
|
|
end
|
|
vim.cmd("packadd " .. name)
|
|
end
|
|
end
|
|
|
|
function M.is_imported(name)
|
|
return priv.is.import[name] or false
|
|
end
|
|
|
|
function M.is_loaded(name)
|
|
return priv.is.config[name] or false
|
|
end
|
|
|
|
function M.load(name)
|
|
unshim_plugin(name)
|
|
M.init(name)
|
|
M.import(name)
|
|
M.config(name)
|
|
end
|
|
|
|
function M.dep_names()
|
|
return M.dep_names_by(function() return true end):totable()
|
|
end
|
|
|
|
function M.dep_names_by(fn)
|
|
return M.deps_iter_by(fn):map(function(v) return v.name end)
|
|
end
|
|
|
|
function M.deps_iter_by(fn)
|
|
return vim.iter(deps):map(function(k, v) return v end):filter(fn)
|
|
end
|
|
|
|
function M.non_lazy_deps()
|
|
return M.deps_iter_by(function(dep)
|
|
return not dep.lazy
|
|
end):totable()
|
|
end
|
|
|
|
function M.lazy_deps()
|
|
return M.deps_iter_by(function(dep)
|
|
return dep.lazy
|
|
end):totable()
|
|
end
|
|
|
|
function lazy_load_dep(dep, cmd)
|
|
return function(param)
|
|
M.load(dep.name)
|
|
local bang = param.bang and '!' or ''
|
|
vim.cmd(cmd .. bang .. ' ' .. param.args)
|
|
end
|
|
end
|
|
|
|
function shim_plugin(dep)
|
|
if priv.is.shim[dep.name] then
|
|
return
|
|
end
|
|
priv.is.shim[dep.name] = true
|
|
if dep.cmd then
|
|
for _, cmd in ipairs(dep.cmd) do
|
|
vim.api.nvim_create_user_command(cmd, lazy_load_dep(dep, cmd), {
|
|
desc = "Sloth-flake placeholder for plugin " .. dep.name,
|
|
nargs = '*',
|
|
bang = true,
|
|
})
|
|
end
|
|
end
|
|
end
|
|
|
|
function unshim_plugin(name)
|
|
local dep = M.get(name)
|
|
if not priv.is.shim[name] then
|
|
return
|
|
end
|
|
priv.is.shim[name] = nil
|
|
if dep.cmd then
|
|
for _, cmd in ipairs(dep.cmd) do
|
|
vim.api.nvim_del_user_command(cmd)
|
|
end
|
|
end
|
|
end
|
|
|
|
function M.setup(config)
|
|
local post_init = config and config.post_init or function() end
|
|
|
|
M.init_non_lazy()
|
|
post_init()
|
|
M.import_non_lazy()
|
|
M.config_non_lazy()
|
|
|
|
local lazy_deps = M.lazy_deps()
|
|
for _, dep in ipairs(lazy_deps) do
|
|
shim_plugin(dep)
|
|
end
|
|
end
|
|
|
|
return M
|