diff options
| author | Bogdan Nikolov <84232456+0xr3ngar@users.noreply.github.com> | 2026-02-19 20:30:08 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2026-02-19 20:30:08 +0100 |
| commit | 725bf38ffc08cb8b537cbff322ef2d889b197dad (patch) | |
| tree | 2fa53c6b40463b8a18d9e175617b9b413a844e70 /lua/99/ops/tutorial.lua | |
| parent | 6d219f47aa29cafb1ec39c41d4dd0a4875a74506 (diff) | |
| parent | d34e4dcbcc1f95d8f31f851baad18da12c59e7df (diff) | |
| download | a4-725bf38ffc08cb8b537cbff322ef2d889b197dad.tar.xz a4-725bf38ffc08cb8b537cbff322ef2d889b197dad.zip | |
Merge branch 'master' into master
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 |
