summaryrefslogtreecommitdiff
path: root/lua/99/ops/tutorial.lua
diff options
context:
space:
mode:
Diffstat (limited to 'lua/99/ops/tutorial.lua')
-rw-r--r--lua/99/ops/tutorial.lua72
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