Skip to content

Commit c6173ec

Browse files
ref(script)!: modularize script runner client
1 parent 0f9b600 commit c6173ec

File tree

10 files changed

+140
-91
lines changed

10 files changed

+140
-91
lines changed

Makefile

+1-2
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,5 @@ docgen:
1515
lemmy-help lua/rest-nvim/commands.lua > doc/rest-nvim-commands.txt
1616
lemmy-help lua/rest-nvim/config/init.lua > doc/rest-nvim-config.txt
1717
lemmy-help lua/rest-nvim/cookie_jar.lua > doc/rest-nvim-cookies.txt
18-
lemmy-help lua/rest-nvim/script.lua > doc/rest-nvim-script.txt
19-
lemmy-help lua/rest-nvim/api.lua lua/rest-nvim/client/init.lua lua/rest-nvim/ui/result.lua lua/rest-nvim/utils.lua > doc/rest-nvim-api.txt
18+
lemmy-help lua/rest-nvim/api.lua lua/rest-nvim/client/init.lua lua/rest-nvim/script/init.lua lua/rest-nvim/ui/result.lua lua/rest-nvim/utils.lua > doc/rest-nvim-api.txt
2019
lemmy-help lua/rest-nvim/client/curl/cli.lua lua/rest-nvim/client/curl/utils.lua > doc/rest-nvim-client-curl.txt

doc/rest-nvim-api.txt

+31
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,31 @@ client:request({req}) *client:request*
6666
(nio.control.Future) Future containing `rest.Response`
6767

6868

69+
==============================================================================
70+
script runner client for rest.nvim *rest-nvim.script*
71+
72+
73+
Script runner client for rest.nvim.
74+
This can be external module like `rest.client`
75+
76+
77+
rest.ScriptClient *rest.ScriptClient*
78+
79+
80+
script:load_pre_req_hook({str}, {ctx}) *script:load_pre_req_hook*
81+
82+
Parameters: ~
83+
{str} (string)
84+
{ctx} (rest.Context)
85+
86+
87+
script:load_post_req_hook({str}, {ctx}) *script:load_post_req_hook*
88+
89+
Parameters: ~
90+
{str} (string)
91+
{ctx} (rest.Context)
92+
93+
6994
==============================================================================
7095
rest.nvim result UI module *rest-nvim.ui.result*
7196

@@ -181,6 +206,12 @@ utils.ts_find({node}, {type}) *utils.ts_find*
181206
{type} (string) @return TSNode?
182207

183208

209+
utils.ts_upper_node({node}) *utils.ts_upper_node*
210+
211+
Parameters: ~
212+
{node} (TSNode)
213+
214+
184215
*utils.ts_node_spec*
185216
utils.ts_node_spec({node}, {expected_type})
186217

doc/rest-nvim-script.txt

-67
Original file line numberDiff line numberDiff line change
@@ -1,67 +0,0 @@
1-
==============================================================================
2-
rest.nvim pre-request/request handler module *rest-nvim.script*
3-
4-
rest.Env.Request.Variables *rest.Env.Request.Variables*
5-
6-
Fields: ~
7-
{set} (fun(key:string,value:string)) Set variable
8-
{get} (fun(key:string):string) Retrieve variable
9-
10-
11-
script.create_prescript_env({ctx}) *script.create_prescript_env*
12-
13-
Parameters: ~
14-
{ctx} (rest.Context)
15-
16-
Returns: ~
17-
(rest.PreScriptEnv)
18-
19-
20-
rest.PreScriptEnv *rest.PreScriptEnv*
21-
Global Environment variables passed to pre-request scripts
22-
23-
24-
rest.PreScriptEnv.Request *rest.PreScriptEnv.Request*
25-
26-
27-
script.create_handler_env({ctx}, {res}) *script.create_handler_env*
28-
29-
Parameters: ~
30-
{ctx} (rest.Context)
31-
{res} (rest.Response)
32-
33-
Returns: ~
34-
(rest.HandlerEnv)
35-
36-
37-
rest.HandlerEnv *rest.HandlerEnv*
38-
Global Environment variables passed to response handler scripts
39-
40-
41-
rest.HandlerEnv.Client *rest.HandlerEnv.Client*
42-
43-
44-
rest.HandlerEnv.Request *rest.HandlerEnv.Request*
45-
46-
47-
script.load_prescript({s}, {ctx}) *script.load_prescript*
48-
49-
Parameters: ~
50-
{s} (string)
51-
{ctx} (rest.Context)
52-
53-
Returns: ~
54-
(function)
55-
56-
57-
script.load_handler({s}, {ctx}) *script.load_handler*
58-
59-
Parameters: ~
60-
{s} (string)
61-
{ctx} (rest.Context)
62-
63-
Returns: ~
64-
(function)
65-
66-
67-
vim:tw=78:ts=8:noet:ft=help:norl:

lua/rest-nvim/parser/init.lua

+37-15
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@
1010
local parser = {}
1111

1212
local Context = require("rest-nvim.context").Context
13-
local script = require("rest-nvim.script")
1413
local utils = require("rest-nvim.utils")
1514
local logger = require("rest-nvim.logger")
1615
local jar = require("rest-nvim.cookie_jar")
@@ -195,29 +194,49 @@ end
195194

196195
---@param node TSNode
197196
---@param source Source
197+
---@return string lang
198198
---@return string str
199199
local function parse_script(node, source)
200-
vim.validate({ node = utils.ts_node_spec(node, "script") })
201-
local str = vim.treesitter.get_node_text(node, source):sub(3,-3)
202-
return str
200+
local lang = "javascript"
201+
local prev_node = utils.ts_upper_node(node)
202+
if prev_node and prev_node:type() == "comment" and get_node_field_text(prev_node, "name", source) == "lang" then
203+
local value = get_node_field_text(prev_node, "value", source)
204+
if value then
205+
lang = value
206+
end
207+
end
208+
local script_node = assert(node:named_child(0))
209+
local str = vim.treesitter.get_node_text(script_node, source):sub(3,-3)
210+
return lang, str
203211
end
204212

205-
---@param script_node TSNode
213+
---@param node TSNode
206214
---@param source Source
207215
---@param context rest.Context
208-
function parser.parse_pre_request_script(script_node, source, context)
209-
local node = assert(script_node:named_child(0))
210-
local str = parse_script(node, source)
211-
script.load_prescript(str, context)()
216+
function parser.parse_pre_request_script(node, source, context)
217+
local lang, str = parse_script(node, source)
218+
local ok, script = pcall(require, "rest-nvim.script." .. lang)
219+
if not ok then
220+
logger.error(("failed to load script with language '%s'. Can't find script runner client."):format(lang))
221+
return
222+
end
223+
---@cast script rest.ScriptClient
224+
script:load_pre_req_hook(str, context)()
212225
end
213226

214-
---@param handler_node TSNode
227+
---@param node TSNode
215228
---@param source Source
216229
---@param context rest.Context
217-
function parser.parse_request_handler(handler_node, source, context)
218-
local node = assert(handler_node:named_child(0))
219-
local str = parse_script(node, source)
220-
return script.load_handler(str, context)
230+
---@return function?
231+
function parser.parse_request_handler(node, source, context)
232+
local lang, str = parse_script(node, source)
233+
local ok, script = pcall(require, "rest-nvim.script." .. lang)
234+
if not ok then
235+
logger.error(("failed to load script with language '%s'. Can't find script runner client."):format(lang))
236+
return
237+
end
238+
---@cast script rest.ScriptClient
239+
return script:load_post_req_hook(str, context)
221240
end
222241

223242
---@param source Source
@@ -281,7 +300,10 @@ function parser.parse(node, source, ctx)
281300
if node_type == "pre_request_script" then
282301
parser.parse_pre_request_script(child, source, ctx)
283302
elseif node_type == "res_handler_script" then
284-
table.insert(handlers, parser.parse_request_handler(child, source, ctx))
303+
local handler = parser.parse_request_handler(child, source, ctx)
304+
if handler then
305+
table.insert(handlers, handler)
306+
end
285307
elseif node_type == "request_separator" then
286308
name = get_node_field_text(child, "value", source)
287309
elseif node_type == "comment" and get_node_field_text(child, "name", source) == "name" then

lua/rest-nvim/script/init.lua

+30
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
---@mod rest-nvim.script script runner client for rest.nvim
2+
---
3+
---@brief [[
4+
---
5+
--- Script runner client for rest.nvim.
6+
--- This can be external module like `rest.client`
7+
---
8+
---@brief ]]
9+
10+
---@class rest.ScriptClient
11+
local script = {}
12+
13+
---@param str string
14+
---@param ctx rest.Context
15+
function script:load_pre_req_hook(str, ctx)
16+
return function ()
17+
vim.print(str, ctx)
18+
end
19+
end
20+
21+
---@param str string
22+
---@param ctx rest.Context
23+
function script:load_post_req_hook(str, ctx)
24+
---@param res rest.Response
25+
return function (res)
26+
vim.print(str, ctx, res)
27+
end
28+
end
29+
30+
return script

lua/rest-nvim/script.lua renamed to lua/rest-nvim/script/lua.lua

+2-2
Original file line numberDiff line numberDiff line change
@@ -96,14 +96,14 @@ end
9696
---@param s string
9797
---@param ctx rest.Context
9898
---@return function
99-
function script.load_prescript(s, ctx)
99+
function script:load_pre_req_hook(s, ctx)
100100
return script.load(s, script.create_prescript_env(ctx))
101101
end
102102

103103
---@param s string
104104
---@param ctx rest.Context
105105
---@return function
106-
function script.load_handler(s, ctx)
106+
function script:load_post_req_hook(s, ctx)
107107
return function (res)
108108
script.load(s, script.create_handler_env(ctx, res))()
109109
end

lua/rest-nvim/utils.lua

+13
Original file line numberDiff line numberDiff line change
@@ -217,6 +217,19 @@ function utils.ts_find(node, type)
217217
return nil
218218
end
219219

220+
---@param node TSNode
221+
function utils.ts_upper_node(node)
222+
local start_row, _, _, _ = node:range()
223+
local end_row = start_row
224+
start_row = start_row - 1
225+
local start_col = 0
226+
local end_col = 0
227+
-- HACK: root node type might not be "document"
228+
local root_node = assert(utils.ts_find(node, "document"))
229+
local min_node = root_node:named_descendant_for_range(start_row, start_col, end_row, end_col)
230+
return min_node
231+
end
232+
220233
---@param node TSNode
221234
---@param expected_type string
222235
---@return table

spec/api_spec.lua

+3-3
Original file line numberDiff line numberDiff line change
@@ -168,10 +168,10 @@ X-DATE: {{$date}}
168168
}, c.vars)
169169
end)
170170
it("parse pre-request script", function ()
171-
local source = "< {%\nrequest.variables.set('foo', 'bar')\n%}\n"
171+
local source = "# @lang=lua\n< {%\nrequest.variables.set('foo', 'bar')\n%}\n"
172172
local _, tree = utils.ts_parse_source(source)
173173
local c = context:new()
174-
local script_node = tree:root():child(0):child(0)
174+
local script_node = tree:root():child(0):child(1)
175175
assert(script_node)
176176
assert.same("pre_request_script", script_node:type())
177177
parser.parse_pre_request_script(script_node, source, c)
@@ -202,7 +202,7 @@ X-DATE: {{$date}}
202202
request.variables.set("bar", "new")
203203
request.variables.set("baz", "new")
204204
]]
205-
local h = require("rest-nvim.script.lua").load_handler(script, ctx)
205+
local h = require("rest-nvim.script.lua"):load_post_req_hook(script, ctx)
206206
h()
207207
assert.same("new", vim.env["foo"])
208208
assert.same("new", ctx:resolve("bar"))

spec/script_spec.lua

+2-2
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,13 @@ require("spec.minimum_init")
44

55
local parser = require("rest-nvim.parser")
66
local utils = require("rest-nvim.utils")
7-
-- local context = require("rest-nvim.context").Context
8-
-- local logger = require("rest-nvim.logger")
97

108
describe("handler script", function ()
119
it("alter response body", function ()
1210
local source = [[
1311
http://localhost:8000
1412
13+
# @lang=lua
1514
> {%
1615
local json = vim.json.decode(response.body)
1716
json.data = "overwritten"
@@ -33,6 +32,7 @@ response.body = vim.json.encode(json)
3332
local source = [[
3433
http://localhost:8000
3534
35+
# @lang=lua
3636
> {%
3737
local json = vim.json.decode(response.body)
3838
client.global.set("MYVAR", json.var)

spec/utils_spec.lua

+21
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
---@module 'luassert'
2+
3+
local utils = require("rest-nvim.utils")
4+
5+
describe("tree-sitter utils", function ()
6+
local source = [[
7+
http://localhost:8000
8+
9+
# @lang=lua
10+
> {%
11+
local json = vim.json.decode(response.body)
12+
json.data = "overwritten"
13+
response.body = vim.json.encode(json)
14+
%}
15+
]]
16+
local _, tree = utils.ts_parse_source(source)
17+
local script_node = assert(tree:root():child(0):child(1))
18+
assert.same("res_handler_script", script_node:type())
19+
local comment_node = assert(utils.ts_upper_node(script_node))
20+
assert.same("comment", comment_node:type())
21+
end)

0 commit comments

Comments
 (0)