irongit

A Neovim plugin enabling you to solve LeetCode problems.

85 lines2.0 KBLua
1local Group = require("leetcode-ui.group")
2local Lines = require("leetcode-ui.lines")
3local Case = require("leetcode-ui.group.case")
4
5local log = require("leetcode.logger")
6
7---@class lc.ui.Cases : lc.ui.Group
8---@field cases table<integer, lc.ui.Case>
9---@field idx integer
10---@field console lc.ui.Console
11local Cases = Group:extend("LeetCases")
12
13function Cases:nav_case_hl(case, i) --
14 return "leetcode_case_" --
15 .. (self.idx == i and "focus_" or "")
16 .. (case.passed and "ok" or "err")
17end
18
19function Cases:make_nav()
20 local nav = Lines({}, { padding = { top = 1 } })
21
22 for i, case in ipairs(self.cases) do
23 self.console.result:map("n", i, function()
24 self:change(i)
25 end, { clearable = true })
26
27 local hl = self:nav_case_hl(case, i)
28 local msg = (" Case (%d) "):format(i)
29
30 nav:append(msg, hl)
31 if i ~= #self.cases then
32 nav:append(" ")
33 end
34 end
35
36 return nav
37end
38
39function Cases:draw(layout)
40 self:replace({
41 self:make_nav(),
42 self.cases[self.idx],
43 })
44
45 Cases.super.draw(self, layout)
46end
47
48---@param idx integer
49function Cases:change(idx)
50 if not self.cases[idx] or idx == self.idx then
51 return
52 end
53
54 self.idx = idx
55 self.console.result:draw()
56end
57
58---@param item lc.runtime
59---@param parent lc.ui.Console
60---@return lc.ui.Cases
61function Cases:init(item, parent)
62 Cases.super.init(self, {}, { spacing = 1 })
63
64 self.cases = {}
65 self.console = parent
66
67 local total = item.total_testcases ~= vim.NIL and item.total_testcases or 0
68 local testcases = parent.testcase:by_id(item.submission_id)
69
70 for i = 1, total do
71 self.cases[i] = Case({
72 input = testcases[i],
73 output = item.code_answer[i],
74 expected = item.expected_code_answer[i],
75 std_output = item.std_output_list[i],
76 }, item.compare_result:sub(i, i) == "1", parent.question)
77 end
78
79 self:change(1)
80end
81
82---@type fun(item: lc.runtime, parent: lc.ui.Console): lc.ui.Cases
83local LeetCases = Cases
84
85return LeetCases