81 lines
1.9 KiB
Lua
81 lines
1.9 KiB
Lua
---@class cp.Config
|
|
---@field contests table
|
|
---@field snippets table
|
|
---@field hooks table
|
|
|
|
local M = {}
|
|
|
|
---@type cp.Config
|
|
M.defaults = {
|
|
contests = {
|
|
default = {
|
|
cpp_version = 20,
|
|
compile_flags = { "-O2", "-DLOCAL", "-Wall", "-Wextra" },
|
|
debug_flags = { "-g3", "-fsanitize=address,undefined", "-DLOCAL" },
|
|
timeout_ms = 2000,
|
|
},
|
|
atcoder = {
|
|
cpp_version = 23,
|
|
},
|
|
codeforces = {
|
|
cpp_version = 23,
|
|
},
|
|
cses = {
|
|
cpp_version = 20,
|
|
},
|
|
},
|
|
snippets = {},
|
|
hooks = {
|
|
before_run = nil,
|
|
before_debug = nil,
|
|
},
|
|
}
|
|
|
|
---@param base_config table
|
|
---@param contest_config table
|
|
---@return table
|
|
local function extend_contest_config(base_config, contest_config)
|
|
local result = vim.tbl_deep_extend("force", base_config, contest_config)
|
|
|
|
local std_flag = ("-std=c++%d"):format(result.cpp_version)
|
|
table.insert(result.compile_flags, 1, std_flag)
|
|
table.insert(result.debug_flags, 1, std_flag)
|
|
|
|
return result
|
|
end
|
|
|
|
---@param user_config table|nil
|
|
---@return table
|
|
function M.setup(user_config)
|
|
vim.validate({
|
|
user_config = { user_config, { "table", "nil" }, true },
|
|
})
|
|
|
|
if user_config then
|
|
vim.validate({
|
|
contests = { user_config.contests, { "table", "nil" }, true },
|
|
snippets = { user_config.snippets, { "table", "nil" }, true },
|
|
hooks = { user_config.hooks, { "table", "nil" }, true },
|
|
})
|
|
|
|
if user_config.hooks then
|
|
vim.validate({
|
|
before_run = { user_config.hooks.before_run, { "function", "nil" }, true },
|
|
before_debug = { user_config.hooks.before_debug, { "function", "nil" }, true },
|
|
})
|
|
end
|
|
end
|
|
|
|
local config = vim.tbl_deep_extend("force", M.defaults, user_config or {})
|
|
|
|
local default_contest = config.contests.default
|
|
for contest_name, contest_config in pairs(config.contests) do
|
|
if contest_name ~= "default" then
|
|
config.contests[contest_name] = extend_contest_config(default_contest, contest_config)
|
|
end
|
|
end
|
|
|
|
return config
|
|
end
|
|
|
|
return M
|