Skip to content

Commit e721684

Browse files
feat: handler script support
Now handler script can alter the response data
1 parent 611450a commit e721684

File tree

5 files changed

+65
-13
lines changed

5 files changed

+65
-13
lines changed

lua/rest-nvim/context.lua

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ local M = {}
66

77
---@class rest.Context
88
---@field vars table<string,string>
9-
---@field response? rest.Response
109
local Context = {}
1110
Context.__index = Context
1211

lua/rest-nvim/request.lua

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,14 +40,14 @@ local function run_request(req)
4040
local ok, res = pcall(client.request(req).wait)
4141
if not ok then
4242
logger.error("request failed")
43-
-- TODO: should return here
43+
vim.notify("request failed", vim.log.levels.ERROR)
4444
return
4545
end
4646
---@cast res rest.Response
4747
logger.info("request success")
4848

4949
-- run request handler scripts
50-
vim.iter(req.handlers):each(function (f) f() end)
50+
vim.iter(req.handlers):each(function (f) f(res) end)
5151
logger.info("handler done")
5252

5353
-- update cookie jar

lua/rest-nvim/script.lua

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -33,14 +33,13 @@ function M.create_prescript_env(ctx)
3333
end
3434

3535
---@param ctx rest.Context
36+
---@param res rest.Response
3637
---@return rest.HandlerEnv
37-
function M.create_handler_env(ctx)
38+
function M.create_handler_env(ctx, res)
3839
---@class rest.HandlerEnv
3940
local env = {
4041
---@class rest.HandlerEnv.Client
4142
client = {
42-
test = function () end,
43-
assert = function () end,
4443
---@type rest.Env.Request.Variables
4544
global = {
4645
---set global variable (this overwrites `vim.env`)
@@ -55,11 +54,6 @@ function M.create_handler_env(ctx)
5554
},
5655
---@class rest.HandlerEnv.Request
5756
request = {
58-
body = {},
59-
environment = {},
60-
headers = {},
61-
method = "GET",
62-
url = "",
6357
---@type rest.Env.Request.Variables
6458
variables = {
6559
---sets request-local variable
@@ -73,7 +67,7 @@ function M.create_handler_env(ctx)
7367
}
7468
},
7569
-- TODO: create wrapper class for response
76-
response = ctx.response,
70+
response = res,
7771
vim = vim
7872
}
7973
return env
@@ -101,7 +95,9 @@ end
10195
---@param ctx rest.Context
10296
---@return function
10397
function M.load_handler(script, ctx)
104-
return M.load(script, M.create_handler_env(ctx))
98+
return function (res)
99+
M.load(script, M.create_handler_env(ctx, res))()
100+
end
105101
end
106102

107103
return M

spec/minimum_init.lua

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,11 @@ vim.g.rest_nvim = {
1515
_log_level = vim.log.levels.INFO,
1616
cookies = {
1717
path = "/tmp/rest-nvim.cookies"
18+
},
19+
result = {
20+
behavior = {
21+
formatters = {}
22+
},
1823
}
1924
}
2025
vim.uv.fs_unlink(vim.g.rest_nvim.cookies.path)

spec/script_spec.lua

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
---@module 'luassert'
2+
3+
require("spec.minimum_init")
4+
5+
local parser = require("rest-nvim.parser")
6+
local utils = require("rest-nvim.utils")
7+
-- local context = require("rest-nvim.context").Context
8+
-- local logger = require("rest-nvim.logger")
9+
10+
describe("handler script", function ()
11+
it("alter response body", function ()
12+
local source = [[
13+
http://localhost:8000
14+
15+
> {%
16+
local json = vim.json.decode(response.body)
17+
json.data = "overwritten"
18+
response.body = vim.json.encode(json)
19+
%}
20+
]]
21+
local _, tree = utils.ts_parse_source(source)
22+
local req_node = assert(tree:root():child(0))
23+
local req = assert(parser.parse(req_node, source))
24+
---@type rest.Response
25+
---@diagnostic disable-next-line: missing-fields
26+
local res = {
27+
body = [[{"data": "given"}]]
28+
}
29+
vim.iter(req.handlers):each(function (f) f(res) end)
30+
assert.same([[{"data":"overwritten"}]], res.body)
31+
end)
32+
it("update context from response body", function ()
33+
local source = [[
34+
http://localhost:8000
35+
36+
> {%
37+
local json = vim.json.decode(response.body)
38+
client.global.set("MYVAR", json.var)
39+
%}
40+
]]
41+
local _, tree = utils.ts_parse_source(source)
42+
local req_node = assert(tree:root():child(0))
43+
local req = assert(parser.parse(req_node, source))
44+
---@type rest.Response
45+
---@diagnostic disable-next-line: missing-fields
46+
local res = {
47+
body = [[{"var": "boo"}]]
48+
}
49+
vim.iter(req.handlers):each(function (f) f(res) end)
50+
assert.same("boo", req.context:resolve("MYVAR"))
51+
end)
52+
end)

0 commit comments

Comments
 (0)