fix(config): better file org

This commit is contained in:
Barrett Ruth 2025-10-04 19:54:53 -04:00
parent a76d228e3f
commit d2bde9bad8
12 changed files with 77 additions and 79 deletions

View file

@ -209,30 +209,27 @@ function M.get_constraints(platform, contest_id, problem_id)
end
---@param file_path string
---@return FileState?
---@return FileState|nil
function M.get_file_state(file_path)
if not cache_data.file_states then
return nil
end
M.load()
cache_data.file_states = cache_data.file_states or {}
return cache_data.file_states[file_path]
end
---@param file_path string
---@param path string
---@param platform string
---@param contest_id string
---@param problem_id? string
function M.set_file_state(file_path, platform, contest_id, problem_id)
if not cache_data.file_states then
cache_data.file_states = {}
end
cache_data.file_states[file_path] = {
---@param problem_id string
---@param language string|nil
function M.set_file_state(path, platform, contest_id, problem_id, language)
M.load()
cache_data.file_states = cache_data.file_states or {}
cache_data.file_states[path] = {
platform = platform,
contest_id = contest_id,
problem_id = problem_id,
language = language,
}
M.save()
end
@ -255,7 +252,7 @@ end
function M.set_contest_summaries(platform, contests)
cache_data[platform] = cache_data[platform] or {}
for _, contest in ipairs(contests) do
cache_data[platform][contest.id] = cache_data[platform][contest] or {}
cache_data[platform][contest.id] = cache_data[platform][contest.id] or {}
cache_data[platform][contest.id].display_name = contest.display_name
cache_data[platform][contest.id].name = contest.name
end
@ -284,4 +281,6 @@ function M.get_data_pretty()
return vim.inspect(cache_data)
end
M._cache = cache_data
return M

View file

@ -8,9 +8,9 @@ local logger = require('cp.log')
function M.handle_pick_action()
local config = config_module.get_config()
if not config.picker then
if not (config.ui and config.ui.picker) then
logger.log(
'No picker configured. Set picker = "{telescope,fzf-lua}" in your config.',
'No picker configured. Set ui.picker = "{telescope,fzf-lua}" in your config.',
vim.log.levels.ERROR
)
return
@ -18,7 +18,8 @@ function M.handle_pick_action()
local picker
if config.picker == 'telescope' then
local picker_name = config.ui.picker
if picker_name == 'telescope' then
local ok = pcall(require, 'telescope')
if not ok then
logger.log(
@ -34,7 +35,7 @@ function M.handle_pick_action()
end
picker = telescope_picker
elseif config.picker == 'fzf-lua' then
elseif picker_name == 'fzf-lua' then
local ok, _ = pcall(require, 'fzf-lua')
if not ok then
logger.log(

View file

@ -121,7 +121,7 @@ local function is_string_list(t)
if type(t) ~= 'table' then
return false
end
for i, v in ipairs(t) do
for _, v in ipairs(t) do
if type(v) ~= 'string' then
return false
end
@ -263,7 +263,6 @@ function M.setup(user_config)
error('[cp.nvim] ' .. err)
end
current_config = cfg
return cfg
end
@ -272,6 +271,7 @@ local current_config = nil
function M.set_current_config(config)
current_config = config
end
function M.get_config()
return current_config or M.defaults
end

View file

@ -4,14 +4,15 @@ local config_module = require('cp.config')
local logger = require('cp.log')
local snippets = require('cp.snippets')
if not vim.fn.has('nvim-0.10.0') then
if vim.fn.has('nvim-0.10.0') == 0 then
logger.log('Requires nvim-0.10.0+', vim.log.levels.ERROR)
return {}
end
local user_config = {}
local config = config_module.setup(user_config)
local config = nil
local snippets_initialized = false
local initialized = false
--- Root handler for all `:CP ...` commands
---@return nil
@ -30,10 +31,11 @@ function M.setup(opts)
snippets.setup(config)
snippets_initialized = true
end
initialized = true
end
function M.is_initialized()
return true
return initialized
end
return M

View file

@ -1,7 +1,6 @@
local M = {}
local cache = require('cp.cache')
local config = require('cp.config').get_config()
local constants = require('cp.constants')
local logger = require('cp.log')
local scraper = require('cp.scraper')
@ -22,8 +21,8 @@ local scraper = require('cp.scraper')
---@return cp.PlatformItem[]
function M.get_platforms()
local config = require('cp.config').get_config()
local result = {}
for _, platform in ipairs(constants.PLATFORMS) do
if config.platforms[platform] then
table.insert(result, {
@ -32,7 +31,6 @@ function M.get_platforms()
})
end
end
return result
end

View file

@ -4,29 +4,27 @@ local cache = require('cp.cache')
local logger = require('cp.log')
local state = require('cp.state')
---@return boolean
function M.restore_from_current_file()
cache.load()
local current_file = vim.fn.expand('%:p')
local current_file = (vim.uv.fs_realpath(vim.fn.expand('%:p')) or vim.fn.expand('%:p'))
local file_state = cache.get_file_state(current_file)
if current_file or not file_state then
if not file_state then
logger.log('No cached state found for current file.', vim.log.levels.ERROR)
return false
end
logger.log(
('Restoring from cached state: %s %s %s'):format(
file_state.platform,
file_state.contest_id,
file_state.problem_id
)
)
local setup = require('cp.setup')
local _ = setup.set_platform(file_state.platform)
setup.set_platform(file_state.platform)
state.set_contest_id(file_state.contest_id)
state.set_problem_id(file_state.problem_id)
setup.setup_contest(file_state.platform, file_state.contest_id, file_state.problem_id)
setup.setup_contest(
file_state.platform,
file_state.contest_id,
file_state.problem_id,
file_state.language
)
return true
end

View file

@ -33,12 +33,8 @@ local function substitute_template(cmd_template, substitutions)
return out
end
function M.build_command(cmd_template, executable, substitutions)
local cmd = substitute_template(cmd_template, substitutions)
if executable then
table.insert(cmd, 1, executable)
end
return cmd
function M.build_command(cmd_template, substitutions)
return substitute_template(cmd_template, substitutions)
end
---@param compile_cmd string[]
@ -166,11 +162,12 @@ end
function M.compile_problem()
local state = require('cp.state')
local config = require('cp.config').get_config()
local platform = state.get_platform() or ''
local language = config.platforms[platform].default_language
local compile_config = config.platforms[platform][language].compile
local eff = config.runtime.effective[platform][language]
local compile_config = eff and eff.commands and eff.commands.build
if not compile_config then
return { success = true, output = nil }
end

View file

@ -94,10 +94,9 @@ local function create_sentinal_panel_data(test_cases)
end
---@param cmd string[]
---@param executable string
---@return string[]
local function build_command(cmd, executable, substitutions)
return execute.build_command(cmd, executable, substitutions)
local function build_command(cmd, substitutions)
return execute.build_command(cmd, substitutions)
end
---@param test_case RanTestCase
@ -109,8 +108,10 @@ local function run_single_test_case(test_case)
local substitutions = { source = source_file, binary = binary_file }
local platform_config = config.platforms[state.get_platform() or '']
local language_config = platform_config[platform_config.default_language]
local cmd = build_command(language_config.test, language_config.executable, substitutions)
local language = platform_config.default_language
local eff = config.runtime.effective[state.get_platform() or ''][language]
local run_template = eff and eff.commands and eff.commands.run or {}
local cmd = build_command(run_template, substitutions)
local stdin_content = (test_case.input or '') .. '\n'
local timeout_ms = (run_panel_state.constraints and run_panel_state.constraints.timeout_ms) or 0
local memory_mb = run_panel_state.constraints and run_panel_state.constraints.memory_mb or 0
@ -121,7 +122,7 @@ local function run_single_test_case(test_case)
local out = r.stdout or ''
local highlights = {}
if out ~= '' then
if config.run_panel.ansi then
if config.ui.run_panel.ansi then
local parsed = ansi.parse_ansi_text(out)
out = table.concat(parsed.lines, '\n')
highlights = parsed.highlights
@ -130,7 +131,7 @@ local function run_single_test_case(test_case)
end
end
local max_lines = config.run_panel.max_output_lines
local max_lines = config.ui.run_panel.max_output_lines
local lines = vim.split(out, '\n')
if #lines > max_lines then
local trimmed = {}
@ -246,7 +247,7 @@ function M.handle_compilation_failure(output)
local txt
local hl = {}
if config.run_panel.ansi then
if config.ui.run_panel.ansi then
local p = ansi.parse_ansi_text(output or '')
txt = table.concat(p.lines, '\n')
hl = p.highlights

View file

@ -1,4 +1,3 @@
-- lua/cp/setup.lua
local M = {}
local cache = require('cp.cache')
@ -40,14 +39,15 @@ end
---@param platform string
---@param contest_id string
---@param problem_id string|nil
function M.setup_contest(platform, contest_id, problem_id)
---@param language? string|nil
function M.setup_contest(platform, contest_id, problem_id, language)
state.set_contest_id(contest_id)
cache.load()
local function proceed(contest_data)
local problems = contest_data.problems
local pid = problems[(problem_id and contest_data.index_map[problem_id] or 1)].id
M.setup_problem(pid)
M.setup_problem(pid, language)
local cached_len = #vim.tbl_filter(function(p)
return not vim.tbl_isempty(cache.get_test_cases(platform, contest_id, p.id))
@ -89,7 +89,8 @@ function M.setup_contest(platform, contest_id, problem_id)
end
---@param problem_id string
function M.setup_problem(problem_id)
---@param language? string
function M.setup_problem(problem_id, language)
local platform = state.get_platform()
if not platform then
logger.log('No platform set.', vim.log.levels.ERROR)
@ -103,17 +104,17 @@ function M.setup_problem(problem_id)
vim.schedule(function()
vim.cmd.only({ mods = { silent = true } })
local language = config.platforms[platform].default_language
local source_file = state.get_source_file(language)
local lang = language or config.platforms[platform].default_language
local source_file = state.get_source_file(lang)
vim.cmd.e(source_file)
local source_buf = vim.api.nvim_get_current_buf()
if vim.api.nvim_buf_get_lines(source_buf, 0, -1, true)[1] == '' then
local has_luasnip, luasnip = pcall(require, 'luasnip')
if has_luasnip then
local prefixed_trigger = ('cp.nvim/%s.%s'):format(platform, language)
vim.api.nvim_buf_set_lines(0, 0, -1, false, { prefixed_trigger })
vim.api.nvim_win_set_cursor(0, { 1, #prefixed_trigger })
local ok, luasnip = pcall(require, 'luasnip')
if ok then
local trigger = ('cp.nvim/%s.%s'):format(platform, lang)
vim.api.nvim_buf_set_lines(0, 0, -1, false, { trigger })
vim.api.nvim_win_set_cursor(0, { 1, #trigger })
vim.cmd.startinsert({ bang = true })
vim.schedule(function()
if luasnip.expandable() then
@ -135,7 +136,8 @@ function M.setup_problem(problem_id)
vim.fn.expand('%:p'),
platform,
state.get_contest_id() or '',
state.get_problem_id()
state.get_problem_id() or '',
lang
)
end)
end

View file

@ -72,18 +72,18 @@ function M.get_source_file(language)
end
local config = require('cp.config').get_config()
local contest_config = config.platforms[M.get_platform()]
if not contest_config then
local plat = M.get_platform()
local platform_cfg = config.platforms[plat]
if not platform_cfg then
return nil
end
local target_language = language or contest_config.default_language
local language_config = contest_config[target_language]
if not language_config or not language_config.extension then
local target_language = language or platform_cfg.default_language
local eff = config.runtime.effective[plat] and config.runtime.effective[plat][target_language]
or nil
if not eff or not eff.extension then
return nil
end
return base_name .. '.' .. language_config.extension
return base_name .. '.' .. eff.extension
end
function M.get_binary_file()

View file

@ -185,7 +185,7 @@ function M.update_diff_panes(
actual_content = actual_content
end
local desired_mode = is_compilation_failure and 'single' or config.run_panel.diff_mode
local desired_mode = is_compilation_failure and 'single' or config.ui.run_panel.diff_mode
local highlight = require('cp.ui.highlight')
local diff_namespace = highlight.create_namespace()
local ansi_namespace = vim.api.nvim_create_namespace('cp_ansi_highlights')

View file

@ -263,13 +263,13 @@ function M.toggle_run_panel(debug)
local modes = { 'none', 'git', 'vim' }
local current_idx = nil
for i, mode in ipairs(modes) do
if config.run_panel.diff_mode == mode then
if config.ui.run_panel.diff_mode == mode then
current_idx = i
break
end
end
current_idx = current_idx or 1
config.run_panel.diff_mode = modes[(current_idx % #modes) + 1]
config.ui.run_panel.diff_mode = modes[(current_idx % #modes) + 1]
refresh_run_panel()
end, { buffer = buf, silent = true })
vim.keymap.set('n', '<c-n>', function()
@ -293,7 +293,7 @@ function M.toggle_run_panel(debug)
refresh_run_panel()
vim.schedule(function()
if config.run_panel.ansi then
if config.ui.run_panel.ansi then
local ansi = require('cp.ui.ansi')
ansi.setup_highlight_groups()
end