A Neovim plugin enabling you to solve LeetCode problems.
feat(config): custom hooks
5 files changed, +45 -12
+3-0lua/leetcode.lua
| @@ -52,6 +52,9 @@ function leetcode.start() | ||
| 52 | 52 | |
| 53 | 53 | leetcode.setup_cmds() |
| 54 | 54 | |
| 55 | + local utils = require("leetcode.utils") | |
| 56 | + utils.exec_hooks("LeetEnter") | |
| 57 | + | |
| 55 | 58 | local theme = require("leetcode.theme") |
| 56 | 59 | theme.setup() |
| 57 | 60 |
+10-10lua/leetcode/api/utils.lua
| @@ -49,6 +49,7 @@ function utils.curl(method, url, params) | ||
| 49 | 49 | if type(params.body) == "table" then params.body = vim.json.encode(params.body) end |
| 50 | 50 | |
| 51 | 51 | local tries = params.retry |
| 52 | + | |
| 52 | 53 | if params.callback then |
| 53 | 54 | local cb = vim.schedule_wrap(params.callback) |
| 54 | 55 | params.callback = function(out, _) |
| @@ -64,15 +65,15 @@ function utils.curl(method, url, params) | ||
| 64 | 65 | |
| 65 | 66 | curl[method](url, params) |
| 66 | 67 | else |
| 67 | - local res, err | |
| 68 | - | |
| 69 | - repeat | |
| 70 | - local out = curl[method](url, params) | |
| 71 | - res, err = utils.handle_res(out) | |
| 72 | - tries = tries - 1 | |
| 73 | - until not (res and not err) or tries > 0 | |
| 74 | - | |
| 75 | - return res, err | |
| 68 | + local out = curl[method](url, params) | |
| 69 | + local res, err = utils.handle_res(out) | |
| 70 | + | |
| 71 | + if err and tries > 0 then | |
| 72 | + params_cpy.retry = tries - 1 | |
| 73 | + utils.curl(method, url, params_cpy) | |
| 74 | + else | |
| 75 | + return res, err | |
| 76 | + end | |
| 76 | 77 | end |
| 77 | 78 | end |
| 78 | 79 | |
| @@ -99,7 +100,6 @@ function utils.handle_res(out) | ||
| 99 | 100 | res = utils.decode(out.body) |
| 100 | 101 | end |
| 101 | 102 | |
| 102 | - -- if err then log.debug(err) end | |
| 103 | 103 | return res, err |
| 104 | 104 | end |
| 105 | 105 |
+10-0lua/leetcode/config/template.lua
| @@ -35,6 +35,10 @@ | ||
| 35 | 35 | ---| "com" |
| 36 | 36 | ---| "cn" |
| 37 | 37 | |
| 38 | +---@alias lc.hook | |
| 39 | +---| "LeetEnter" | |
| 40 | +---| "LeetQuestionEnter" | |
| 41 | + | |
| 38 | 42 | ---@class lc.UserConfig |
| 39 | 43 | local M = { |
| 40 | 44 | ---@type lc.domain |
| @@ -81,6 +85,12 @@ local M = { | ||
| 81 | 85 | |
| 82 | 86 | width = "40%", ---@type string | integer |
| 83 | 87 | }, |
| 88 | + | |
| 89 | + ---@type table<lc.hook, function[]> | |
| 90 | + hooks = { | |
| 91 | + LeetEnter = {}, | |
| 92 | + LeetQuestionEnter = {}, | |
| 93 | + }, | |
| 84 | 94 | } |
| 85 | 95 | |
| 86 | 96 | return M |
+8-2lua/leetcode/ui/question.lua
| @@ -50,6 +50,10 @@ function Question:mount() | ||
| 50 | 50 | vim.api.nvim_set_current_dir(config.home:absolute()) |
| 51 | 51 | vim.cmd("$tabe " .. self.file:absolute()) |
| 52 | 52 | |
| 53 | + utils.exec_hooks("LeetQuestionEnter", { | |
| 54 | + lang = self.lang, | |
| 55 | + }) | |
| 56 | + | |
| 53 | 57 | -- https://github.com/kawre/leetcode.nvim/issues/14 |
| 54 | 58 | if self.lang == "rust" then |
| 55 | 59 | pcall(function() require("rust-tools.standalone").start_standalone_client() end) |
| @@ -92,14 +96,16 @@ function Question:init(problem) | ||
| 92 | 96 | return log.warn("Question is for premium users only") |
| 93 | 97 | end |
| 94 | 98 | |
| 95 | - local lang = utils.get_lang(is_sql(q) and config.sql or config.lang) | |
| 99 | + -- local lang = utils.get_lang(is_sql(q) and config.sql or config.lang) | |
| 96 | 100 | |
| 97 | 101 | self = setmetatable({ |
| 98 | 102 | q = q, |
| 99 | - lang = lang.slug, | |
| 100 | 103 | cache = problem, |
| 104 | + is_sql = q.meta_data.database and true or false, | |
| 101 | 105 | }, self) |
| 102 | 106 | |
| 107 | + self.lang = self.is_sql and config.sql or config.lang | |
| 108 | + | |
| 103 | 109 | return self:handle_mount() |
| 104 | 110 | end |
| 105 | 111 |
+14-0lua/leetcode/utils.lua
| @@ -111,4 +111,18 @@ function utils.get_lang(slug) | ||
| 111 | 111 | return vim.tbl_filter(function(l) return l.slug == slug end, config.langs)[1] or {} |
| 112 | 112 | end |
| 113 | 113 | |
| 114 | +---@param event lc.hook | |
| 115 | +function utils.exec_hooks(event, ...) | |
| 116 | + local log = require("leetcode.logger") | |
| 117 | + local fns = config.user.hooks[event] | |
| 118 | + if not fns then log.error("Unknown hook event: " .. event) end | |
| 119 | + | |
| 120 | + for i, fn in ipairs(fns) do | |
| 121 | + local ok, msg = pcall(fn, ...) | |
| 122 | + if not ok then | |
| 123 | + log.error(("Error executing hook index `%d` in `%s` event: %s"):format(i, event, msg)) | |
| 124 | + end | |
| 125 | + end | |
| 126 | +end | |
| 127 | + | |
| 114 | 128 | return utils |