1+ -- luacheck: push ignore 631
2+
13--[[
24Curl Wrapper
35
@@ -28,6 +30,9 @@ see test/plenary/curl_spec.lua for examples.
2830author = github.com/tami5
2931]]
3032--
33+ --- @alias PlenaryCurlMethod fun ( url : string | PlenaryCurlOptions , opts ?: PlenaryCurlOptions ): PlenaryCurlResponse | PlenaryJob | string[]
34+
35+ -- luacheck: pop
3136
3237local util , parse = {}, {}
3338
@@ -41,6 +46,8 @@ local compat = require "plenary.compat"
4146-- Utils ----------------------------------------------------
4247---- ---------------------------------------------------------
4348
49+ --- @param str string | integer
50+ --- @return string | integer
4451util .url_encode = function (str )
4552 if type (str ) ~= " number" then
4653 str = str :gsub (" \r ?\n " , " \r\n " )
@@ -54,12 +61,20 @@ util.url_encode = function(str)
5461 end
5562end
5663
64+ --- @param kv table<string , string>
65+ --- @param prefix string
66+ --- @param sep string
67+ --- @return string[]
5768util .kv_to_list = function (kv , prefix , sep )
5869 return compat .flatten (F .kv_map (function (kvp )
5970 return { prefix , kvp [1 ] .. sep .. kvp [2 ] }
6071 end , kv ))
6172end
6273
74+ --- @param kv table<string , string>
75+ --- @param sep ? string
76+ --- @param kvsep string
77+ --- @return string
6378util .kv_to_str = function (kv , sep , kvsep )
6479 return F .join (
6580 F .kv_map (function (kvp )
@@ -69,6 +84,7 @@ util.kv_to_str = function(kv, sep, kvsep)
6984 )
7085end
7186
87+ --- @return { [1] : string , [2] : string }
7288util .gen_dump_path = function ()
7389 local path
7490 local id = string.gsub (" xxxx4xxx" , " [xy]" , function (l )
87103-- Parsers ----------------------------------------------------
88104---- -----------------------------------------------------------
89105
106+ --- comment
107+ --- @param t ? table<string , string>
108+ --- @return string[] ?
90109parse .headers = function (t )
91110 if not t then
92111 return
93112 end
113+ --- @param str string
114+ --- @return string
94115 local upper = function (str )
95116 return string.gsub (" " .. str , " %W%l" , string.upper ):sub (2 )
96117 end
97118 return util .kv_to_list (
98119 (function ()
120+ --- @type table<string , string>
99121 local normilzed = {}
100122 for k , v in pairs (t ) do
101123 normilzed [upper (k :gsub (" _" , " %-" ))] = v
@@ -107,13 +129,17 @@ parse.headers = function(t)
107129 )
108130end
109131
132+ --- @param t ? table<string , string>
133+ --- @return string[] ?
110134parse .data_body = function (t )
111135 if not t then
112136 return
113137 end
114138 return util .kv_to_list (t , " -d" , " =" )
115139end
116140
141+ --- @param xs ? string | table<string , string>
142+ --- @return string[] ?
117143parse .raw_body = function (xs )
118144 if not xs then
119145 return
@@ -125,20 +151,26 @@ parse.raw_body = function(xs)
125151 end
126152end
127153
154+ --- @param t ? table<string , string>
155+ --- @return string[] ?
128156parse .form = function (t )
129157 if not t then
130158 return
131159 end
132160 return util .kv_to_list (t , " -F" , " =" )
133161end
134162
163+ --- @param t ? table<string , string>
164+ --- @return string ?
135165parse .curl_query = function (t )
136166 if not t then
137167 return
138168 end
139169 return util .kv_to_str (t , " &" , " =" )
140170end
141171
172+ --- @param s ? string
173+ --- @return { [1] : " -I" | " -X" , [2] : string ? }?
142174parse .method = function (s )
143175 if not s then
144176 return
@@ -150,39 +182,50 @@ parse.method = function(s)
150182 end
151183end
152184
185+ --- @param p ? string
186+ --- @return { [1] : " -d" , [2] : string }?
153187parse .file = function (p )
154188 if not p then
155189 return
156190 end
157191 return { " -d" , " @" .. P .expand (P .new (p )) }
158192end
159193
194+ --- @param xs string | table<string , string>
195+ --- @return { [1] : " -u" , [2] : string }?
160196parse .auth = function (xs )
161197 if not xs then
162198 return
163199 end
164200 return { " -u" , type (xs ) == " table" and util .kv_to_str (xs , nil , " :" ) or xs }
165201end
166202
203+ --- @param xs string
204+ --- @param q table<string , string>
205+ --- @return string ?
167206parse .url = function (xs , q )
168207 if not xs then
169208 return
170209 end
171- q = parse .curl_query (q )
210+ local query = parse .curl_query (q )
172211 if type (xs ) == " string" then
173- return q and xs .. " ?" .. q or xs
212+ return query and xs .. " ?" .. query or xs
174213 elseif type (xs ) == " table" then
175214 error " Low level URL definition is not supported."
176215 end
177216end
178217
218+ --- @param s string ?
219+ --- @return { [1] : " -H" , [2] : string }?
179220parse .accept_header = function (s )
180221 if not s then
181222 return
182223 end
183224 return { " -H" , " Accept: " .. s }
184225end
185226
227+ --- @param s string ?
228+ --- @return { [1] : string }?
186229parse .http_version = function (s )
187230 if not s then
188231 return
198241
199242-- Parse Request -------------------------------------------
200243---- --------------------------------------------------------
244+ --- @class PlenaryCurlOptions
245+ --- @field auth ? string | table<string , string> Basic request auth , ' user:pass' , or {" user" , " pass" }
246+ --- @field body ? string | string[] The request body
247+ --- @field dry_run ? boolean whether to return the args to be ran through curl.
248+ --- @field form ? table<string , string> request form
249+ --- @field http_version ? string HTTP version to use : ' HTTP/0.9' , ' HTTP/1.0' , ' HTTP/1.1' , ' HTTP/2' , or ' HTTP/3'
250+ --- @field insecure ? boolean Allow insecure server connections
251+ --- @field output ? string where to download something.
252+ --- @field proxy ? string [protocol : //] host[ : port] Use this proxy
253+ --- @field query ? table<string , string> url query , append after the url
254+ --- @field raw ? string[] any additonal curl args , it must be an array /list.
255+ --- @field timeout ? integer request timeout in mseconds
256+ --- @field url ? string The url to make the request to.
257+ --- @field accept ? string
258+ --- @field callback ? fun ( response : PlenaryCurlResponse )
259+ --- @field compressed ? boolean
260+ --- @field data ? string[]
261+ --- @field dump ? string
262+ --- @field headers ? string[]
263+ --- @field in_file ? string
264+ --- @field method ? string
265+ --- @field on_error ? fun ( err : { message : string , stderr : string , exit : integer })
266+ --- @field raw_body ? string
267+ --- @field stream ? PlenaryJobCallback
268+
269+ --- @param opts PlenaryCurlOptions
270+ --- @return string[] result , PlenaryCurlOptions opts
201271parse .request = function (opts )
202272 if opts .body then
203- local b = opts .body
273+ local b = opts .body --[[ @as string|string[] ]]
204274 local silent_is_file = function ()
205275 local status , result = pcall (P .is_file , P .new (b ))
206276 return status and result
249319
250320-- Parse response ------------------------------------------
251321---- --------------------------------------------------------
322+ --- @class PlenaryCurlResponse
323+ --- @field status integer
324+ --- @field headers string[]
325+ --- @field body string
326+ --- @field exit integer
327+
328+ --- @param lines string[]
329+ --- @param dump_path string
330+ --- @param code integer
331+ --- @return PlenaryCurlResponse
252332parse .response = function (lines , dump_path , code )
253333 local headers = P .readlines (dump_path )
254334 local status = nil
@@ -275,6 +355,8 @@ parse.response = function(lines, dump_path, code)
275355 }
276356end
277357
358+ --- @param specs PlenaryCurlOptions
359+ --- @return PlenaryCurlResponse | PlenaryJob | string[]
278360local request = function (specs )
279361 local response = {}
280362 local args , opts = parse .request (vim .tbl_extend (" force" , {
@@ -287,6 +369,7 @@ local request = function(specs)
287369 return args
288370 end
289371
372+ --- @type PlenaryJobOptions
290373 local job_opts = {
291374 command = vim .g .plenary_curl_bin_path or " curl" ,
292375 args = args ,
@@ -310,7 +393,7 @@ local request = function(specs)
310393 error (message )
311394 end
312395 end
313- local output = parse .response (j :result (), opts .dump [2 ], code )
396+ local output = parse .response (( j :result () --[[ @as string[] ]] ), opts .dump [2 ], code )
314397 if opts .callback then
315398 return opts .callback (output )
316399 else
331414
332415-- Main ----------------------------------------------------
333416---- --------------------------------------------------------
417+
418+ --- @class PlenaryCurl
419+ --- @field get PlenaryCurlMethod
420+ --- @field post PlenaryCurlMethod
421+ --- @field put PlenaryCurlMethod
422+ --- @field head PlenaryCurlMethod
423+ --- @field patch PlenaryCurlMethod
424+ --- @field delete PlenaryCurlMethod
425+ --- @field request PlenaryCurlMethod
426+
427+ --- @return PlenaryCurl
334428return (function ()
429+ local spec = {}
430+ --- @param method " get" | " post" | " put" | " head" | " patch" | " delete" | " request"
431+ --- @return PlenaryCurlMethod
335432 local partial = function (method )
336433 return function (url , opts )
337434 local spec = {}
0 commit comments