local M = {} M.defaults = { globals = { project_root = "~/Projects", keybinds = { ["po"] = "PolydevManager", }, }, terminal = { preset = nil, border = { enabled = true, type = "rounded", }, }, } local function default_languages(project_root) return { rust = { project_root = project_root .. "/Rust", keybinds = { ["pr"] = "RustRun", }, }, java = { project_root = project_root .. "/Java", keybinds = { ["pr"] = "JavaRun", }, }, lua = { project_root = project_root .. "/Lua", keybinds = { ["pr"] = "LuaRun", }, }, c = { project_root = project_root .. "/C", keybinds = { ["pr"] = "CRun", }, build_attributes = "", }, cpp = { project_root = project_root .. "/CPP", keybinds = { ["pr"] = "CppRun", }, build_attributes = "", }, html = { project_root = project_root .. "/Html", }, } end M.user_config = {} ---@param user_opts table function M.setup(user_opts) -- First merge global and terminal M.user_config = vim.tbl_deep_extend("force", {}, M.defaults, user_opts or {}) -- Now use the final resolved project_root from user_config local root = M.user_config.globals.project_root local langs = default_languages(root) -- Inject languages into the config, respecting user overrides for lang, conf in pairs(langs) do M.user_config[lang] = vim.tbl_deep_extend("force", conf, M.user_config[lang] or {}) end end ---@param lang string ---@return table function M.get(lang) return M.user_config[lang] or {} end return M