feat: wire race, stress, and submit commands and keymaps
Add command parsing and dispatch for :CP race, :CP race stop, :CP stress, and :CP submit. Add tab-completion for race (platform/contest/--lang), stress (cwd executables at arg 2 and 3), and race stop. Add <Plug>(cp-stress), <Plug>(cp-submit), and <Plug>(cp-race-stop) keymaps.
This commit is contained in:
parent
a75694e9e0
commit
bfa2cf893c
2 changed files with 63 additions and 4 deletions
|
|
@ -16,6 +16,8 @@ local actions = constants.ACTIONS
|
|||
---@field platform? string
|
||||
---@field problem_id? string
|
||||
---@field interactor_cmd? string
|
||||
---@field generator_cmd? string
|
||||
---@field brute_cmd? string
|
||||
---@field test_index? integer
|
||||
---@field test_indices? integer[]
|
||||
---@field mode? string
|
||||
|
|
@ -53,6 +55,27 @@ local function parse_command(args)
|
|||
else
|
||||
return { type = 'error', message = 'unknown cache subcommand: ' .. subcommand }
|
||||
end
|
||||
elseif first == 'race' then
|
||||
if args[2] == 'stop' then
|
||||
return { type = 'action', action = 'race_stop' }
|
||||
end
|
||||
if not args[2] or not args[3] then
|
||||
return {
|
||||
type = 'error',
|
||||
message = 'Usage: :CP race <platform> <contest_id> [--lang <lang>]',
|
||||
}
|
||||
end
|
||||
local language = nil
|
||||
if args[4] == '--lang' and args[5] then
|
||||
language = args[5]
|
||||
end
|
||||
return {
|
||||
type = 'action',
|
||||
action = 'race',
|
||||
platform = args[2],
|
||||
contest = args[3],
|
||||
language = language,
|
||||
}
|
||||
elseif first == 'interact' then
|
||||
local inter = args[2]
|
||||
if inter and inter ~= '' then
|
||||
|
|
@ -60,6 +83,13 @@ local function parse_command(args)
|
|||
else
|
||||
return { type = 'action', action = 'interact' }
|
||||
end
|
||||
elseif first == 'stress' then
|
||||
return {
|
||||
type = 'action',
|
||||
action = 'stress',
|
||||
generator_cmd = args[2],
|
||||
brute_cmd = args[3],
|
||||
}
|
||||
elseif first == 'edit' then
|
||||
local test_index = nil
|
||||
if #args >= 2 then
|
||||
|
|
@ -285,6 +315,14 @@ function M.handle_command(opts)
|
|||
elseif cmd.action == 'edit' then
|
||||
local edit = require('cp.ui.edit')
|
||||
edit.toggle_edit(cmd.test_index)
|
||||
elseif cmd.action == 'stress' then
|
||||
require('cp.stress').toggle(cmd.generator_cmd, cmd.brute_cmd)
|
||||
elseif cmd.action == 'submit' then
|
||||
require('cp.submit').submit({ language = cmd.language })
|
||||
elseif cmd.action == 'race' then
|
||||
require('cp.race').start(cmd.platform, cmd.contest, cmd.language)
|
||||
elseif cmd.action == 'race_stop' then
|
||||
require('cp.race').stop()
|
||||
end
|
||||
elseif cmd.type == 'problem_jump' then
|
||||
local platform = state.get_platform()
|
||||
|
|
|
|||
|
|
@ -66,7 +66,7 @@ end, {
|
|||
return filter_candidates(contests)
|
||||
elseif args[2] == 'cache' then
|
||||
return filter_candidates({ 'clear', 'read' })
|
||||
elseif args[2] == 'interact' then
|
||||
elseif args[2] == 'stress' or args[2] == 'interact' then
|
||||
local utils = require('cp.utils')
|
||||
return filter_candidates(utils.cwd_executables())
|
||||
elseif args[2] == 'edit' then
|
||||
|
|
@ -103,6 +103,10 @@ end, {
|
|||
end
|
||||
end
|
||||
return filter_candidates(candidates)
|
||||
elseif args[2] == 'race' then
|
||||
local candidates = { 'stop' }
|
||||
vim.list_extend(candidates, platforms)
|
||||
return filter_candidates(candidates)
|
||||
elseif args[2] == 'next' or args[2] == 'prev' or args[2] == 'pick' then
|
||||
return filter_candidates({ '--lang' })
|
||||
else
|
||||
|
|
@ -112,7 +116,15 @@ end, {
|
|||
end
|
||||
end
|
||||
elseif num_args == 4 then
|
||||
if args[2] == 'cache' and args[3] == 'clear' then
|
||||
if args[2] == 'stress' then
|
||||
local utils = require('cp.utils')
|
||||
return filter_candidates(utils.cwd_executables())
|
||||
elseif args[2] == 'race' and vim.tbl_contains(platforms, args[3]) then
|
||||
local cache = require('cp.cache')
|
||||
cache.load()
|
||||
local contests = cache.get_cached_contest_ids(args[3])
|
||||
return filter_candidates(contests)
|
||||
elseif args[2] == 'cache' and args[3] == 'clear' then
|
||||
local candidates = vim.list_extend({}, platforms)
|
||||
table.insert(candidates, '')
|
||||
return filter_candidates(candidates)
|
||||
|
|
@ -134,7 +146,9 @@ end, {
|
|||
return filter_candidates(candidates)
|
||||
end
|
||||
elseif num_args == 5 then
|
||||
if args[2] == 'cache' and args[3] == 'clear' and vim.tbl_contains(platforms, args[4]) then
|
||||
if args[2] == 'race' and vim.tbl_contains(platforms, args[3]) then
|
||||
return filter_candidates({ '--lang' })
|
||||
elseif args[2] == 'cache' and args[3] == 'clear' and vim.tbl_contains(platforms, args[4]) then
|
||||
local cache = require('cp.cache')
|
||||
cache.load()
|
||||
local contests = cache.get_cached_contest_ids(args[4])
|
||||
|
|
@ -147,7 +161,9 @@ end, {
|
|||
end
|
||||
end
|
||||
elseif num_args == 6 then
|
||||
if vim.tbl_contains(platforms, args[2]) and args[5] == '--lang' then
|
||||
if args[2] == 'race' and vim.tbl_contains(platforms, args[3]) and args[5] == '--lang' then
|
||||
return filter_candidates(get_enabled_languages(args[3]))
|
||||
elseif vim.tbl_contains(platforms, args[2]) and args[5] == '--lang' then
|
||||
return filter_candidates(get_enabled_languages(args[2]))
|
||||
end
|
||||
end
|
||||
|
|
@ -168,3 +184,8 @@ vim.keymap.set('n', '<Plug>(cp-next)', cp_action('next'), { desc = 'CP next prob
|
|||
vim.keymap.set('n', '<Plug>(cp-prev)', cp_action('prev'), { desc = 'CP previous problem' })
|
||||
vim.keymap.set('n', '<Plug>(cp-pick)', cp_action('pick'), { desc = 'CP pick contest' })
|
||||
vim.keymap.set('n', '<Plug>(cp-interact)', cp_action('interact'), { desc = 'CP interactive mode' })
|
||||
vim.keymap.set('n', '<Plug>(cp-stress)', cp_action('stress'), { desc = 'CP stress test' })
|
||||
vim.keymap.set('n', '<Plug>(cp-submit)', cp_action('submit'), { desc = 'CP submit solution' })
|
||||
vim.keymap.set('n', '<Plug>(cp-race-stop)', function()
|
||||
require('cp.race').stop()
|
||||
end, { desc = 'CP stop race countdown' })
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue