irongit

A Neovim plugin enabling you to solve LeetCode problems.

89 lines2.2 KBLua
1local utils = require("leetcode.api.utils")
2local log = require("leetcode.logger")
3local queries = require("leetcode.api.queries")
4local problemlist = require("leetcode.cache.problemlist")
5local urls = require("leetcode.api.urls")
6
7local question = {}
8
9---@class lc.Question.Content
10---@field content string
11
12---@param title_slug string
13---
14---@return lc.question_res|nil
15function question.by_title_slug(title_slug)
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
35end
36
37---@param filters? table
38function question.random(filters)
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
79end
80
81---@param qid integer
82---@param lang lc.lang
83---@param cb function
84function question.latest_submission(qid, lang, cb)
85 local url = urls.latest_submission:format(qid, lang)
86 utils.get(url, { callback = cb })
87end
88
89return question