diff options
Diffstat (limited to 'lua/99/ops/tutorial.lua')
| -rw-r--r-- | lua/99/ops/tutorial.lua | 72 |
1 files changed, 72 insertions, 0 deletions
diff --git a/lua/99/ops/tutorial.lua b/lua/99/ops/tutorial.lua new file mode 100644 index 0000000..320366f --- /dev/null +++ b/lua/99/ops/tutorial.lua @@ -0,0 +1,72 @@ +local Request = require("99.request") +local CleanUp = require("99.ops.clean-up") +local Window = require("99.window") +local make_prompt = require("99.ops.make-prompt") + +local make_clean_up = CleanUp.make_clean_up +local make_observer = CleanUp.make_observer + +--- @class _99.RequestEntry.Data.Tutorial +--- @field type "tutorial" +--- @field buffer number +--- @field window number +--- @field xid number +--- @field tutorial string[] + +--- @param context _99.RequestContext +---@param response string +---@return _99.RequestEntry.Data.Tutorial +local function open_tutorial(context, response) + local content = vim.split(response, "\n") + local win = Window.create_split(content) + + --- @type _99.RequestEntry.Data.Tutorial + local data = { + type = "tutorial", + buffer = win.buffer, + window = win.win, + xid = context.xid, + tutorial = content, + } + context._99:add_data(context, data) + return data +end + +--- @param context _99.RequestContext +---@param opts _99.ops.Opts +local function tutorial(context, opts) + opts = opts or {} + + local logger = context.logger:set_area("tutorial") + logger:debug("starting", "with opts", opts) + + local request = Request.new(context) + + local clean_up = make_clean_up(function() + request:cancel() + end) + + local prompt, refs = + make_prompt(context, context._99.prompts.prompts.tutorial(), opts) + + context:add_references(refs) + request:add_prompt_content(prompt) + context:add_clean_up(clean_up) + + request:start(make_observer(clean_up, function(status, response) + vim.schedule(clean_up) + if status == "cancelled" then + logger:debug("cancelled") + elseif status == "failed" then + logger:error( + "failed", + "error response", + response or "no response provided" + ) + elseif status == "success" then + local data = open_tutorial(context, response) + context._99:open_tutorial(data) + end + end)) +end +return tutorial |
