config: default options table with deep merge

This commit is contained in:
swaits committed 2026-04-11 16:36:05 -06:00
1 parent c7bd79ff6e
commit 628b7b7737
2 files changed
+104 -1

No files matched your search

+67 -1
View File
@@ -1,5 +1,71 @@
local M = {}
M.defaults = {}
M.defaults = {
help_on_enter = true,
builtin_adapters = true,
keys = {
continue = "c",
step_over = "s",
step_into = "d",
step_out = "r",
run_to_cursor = "C",
breakpoint = "x",
cond_breakpoint = "X",
watch = "W",
hover = "K",
eval = "E",
terminate = "q",
restart = "R",
help = "?",
},
dapui = {
controls = { enabled = false },
layouts = {
{
position = "right",
size = 40,
elements = {
{ id = "scopes", size = 0.50 },
{ id = "watches", size = 0.25 },
{ id = "stacks", size = 0.25 },
},
},
{
position = "bottom",
size = 12,
elements = {
{ id = "repl", size = 0.50 },
{ id = "console", size = 0.50 },
},
},
},
},
virtual_text = {
commented = true,
highlight_changed_variables = true,
only_first_definition = false,
all_frames = false,
},
adapters = {},
}
M.opts = vim.deepcopy(M.defaults)
function M.merge(user_opts)
M.opts = vim.tbl_deep_extend("force", vim.deepcopy(M.defaults), user_opts or {})
-- preserve false values for disabled keys (tbl_deep_extend drops them)
if user_opts and user_opts.keys then
for k, v in pairs(user_opts.keys) do
if v == false then
M.opts.keys[k] = false
end
end
end
return M.opts
end
return M
+37
View File
@@ -0,0 +1,37 @@
-- tests for config module
local config = require("tiny-debugger.config")
local function assert_eq(a, b, msg)
if a ~= b then
error(string.format("FAIL: %s — expected %s, got %s", msg, vim.inspect(b), vim.inspect(a)))
end
end
-- test 1: defaults unchanged after empty merge
local opts = config.merge({})
assert_eq(opts.keys.continue, "c", "default continue key")
assert_eq(opts.help_on_enter, true, "default help_on_enter")
assert_eq(opts.builtin_adapters, true, "default builtin_adapters")
assert_eq(#opts.dapui.layouts, 2, "default layout count")
-- test 2: partial key override
opts = config.merge({ keys = { continue = "g" } })
assert_eq(opts.keys.continue, "g", "overridden continue key")
assert_eq(opts.keys.step_over, "s", "preserved step_over key")
assert_eq(opts.keys.terminate, "q", "preserved terminate key")
-- test 3: disable a key with false
opts = config.merge({ keys = { continue = false } })
assert_eq(opts.keys.continue, false, "disabled continue key")
assert_eq(opts.keys.step_over, "s", "preserved step_over after disable")
-- test 4: override help_on_enter
opts = config.merge({ help_on_enter = false })
assert_eq(opts.help_on_enter, false, "overridden help_on_enter")
assert_eq(opts.keys.continue, "c", "keys preserved after help override")
-- test 5: merge doesn't mutate defaults
config.merge({ keys = { continue = "z" } })
assert_eq(config.defaults.keys.continue, "c", "defaults not mutated")
print("ALL CONFIG TESTS PASSED")