A Neovim plugin enabling you to solve LeetCode problems.
| 1 | local utils = require("leetcode.api.utils") |
| 2 | local log = require("leetcode.logger") |
| 3 | local queries = require("leetcode.api.queries") |
| 4 | local problemlist = require("leetcode.cache.problemlist") |
| 5 | local urls = require("leetcode.api.urls") |
| 6 | |
| 7 | local question = {} |
| 8 | |
| 9 | ---@class lc.Question.Content |
| 10 | ---@field content string |
| 11 | |
| 12 | ---@param title_slug string |
| 13 | --- |
| 14 | ---@return lc.question_res|nil |
| 15 | |
| 16 | local variables = { |
| 17 | titleSlug = title_slug, |
| 18 | } |
| 19 | |
| 20 | local query = queries.question |
| 21 | |
| 22 | local res, err = utils.query(query, variables) |
| 23 | if not res or err then |
| 24 | return log.err(err) |
| 25 | end |
| 26 | |
| 27 | local q = res.data.question |
| 28 | q.meta_data = select(2, pcall(utils.decode, q.meta_data)) |
| 29 | q.stats = select(2, pcall(utils.decode, q.stats)) |
| 30 | if type(q.similar) == "string" then |
| 31 | q.similar = utils.normalize_similar_cn(q.similar) |
| 32 | end |
| 33 | |
| 34 | return q |
| 35 | end |
| 36 | |
| 37 | ---@param filters? table |
| 38 | |
| 39 | local variables = { |
| 40 | categorySlug = "algorithms", |
| 41 | filters = filters or vim.empty_dict(), |
| 42 | } |
| 43 | |
| 44 | local query = queries.random_question |
| 45 | |
| 46 | local config = require("leetcode.config") |
| 47 | local res, err = utils.query(query, variables) |
| 48 | if err then |
| 49 | return nil, err |
| 50 | end |
| 51 | |
| 52 | local q = res.data.randomQuestion |
| 53 | |
| 54 | if q == vim.NIL then |
| 55 | local msg = "Random question fetch responded with `null`" |
| 56 | |
| 57 | if filters then |
| 58 | msg = msg .. ".\n\nMaybe invalid filters?\n" .. vim.inspect(filters) |
| 59 | end |
| 60 | |
| 61 | return nil, { msg = msg, lvl = vim.log.levels.ERROR } |
| 62 | end |
| 63 | |
| 64 | if config.is_cn then |
| 65 | q = { |
| 66 | title_slug = q, |
| 67 | paid_only = problemlist.get_by_title_slug(q).paid_only, |
| 68 | } |
| 69 | end |
| 70 | |
| 71 | if not config.auth.is_premium and q.paid_only then |
| 72 | err = err or {} |
| 73 | err.msg = "Drawn question is for premium users only. Please try again" |
| 74 | err.lvl = vim.log.levels.WARN |
| 75 | return nil, err |
| 76 | end |
| 77 | |
| 78 | return q |
| 79 | end |
| 80 | |
| 81 | ---@param qid integer |
| 82 | ---@param lang lc.lang |
| 83 | ---@param cb function |
| 84 | |
| 85 | local url = urls.latest_submission:format(qid, lang) |
| 86 | utils.get(url, { callback = cb }) |
| 87 | end |
| 88 | |
| 89 | return question |