diff --git a/lua/cp/commands/init.lua b/lua/cp/commands/init.lua index 316bb5c..1e158c7 100644 --- a/lua/cp/commands/init.lua +++ b/lua/cp/commands/init.lua @@ -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 [--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() diff --git a/plugin/cp.lua b/plugin/cp.lua index 2689e71..e9b159b 100644 --- a/plugin/cp.lua +++ b/plugin/cp.lua @@ -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', '(cp-next)', cp_action('next'), { desc = 'CP next prob vim.keymap.set('n', '(cp-prev)', cp_action('prev'), { desc = 'CP previous problem' }) vim.keymap.set('n', '(cp-pick)', cp_action('pick'), { desc = 'CP pick contest' }) vim.keymap.set('n', '(cp-interact)', cp_action('interact'), { desc = 'CP interactive mode' }) +vim.keymap.set('n', '(cp-stress)', cp_action('stress'), { desc = 'CP stress test' }) +vim.keymap.set('n', '(cp-submit)', cp_action('submit'), { desc = 'CP submit solution' }) +vim.keymap.set('n', '(cp-race-stop)', function() + require('cp.race').stop() +end, { desc = 'CP stop race countdown' })