Module:LuaCall: Difference between revisions

From Test Wiki
Content deleted Content added
This module is complicated enough as is. You don't need to add even more tangential functions, when p.call was working perfectly fine for months
auto converting argument to number often lead to bug, ex. {{#invoke:LuaCall|call|mw.text.nowiki|0001}}, p.call_s is easier for user to use (and tend to produce less bug) than p.call when all argument is to be string
Line 42: Line 42:
end
end


local function callWithTonumberOrStringOnPairs(f, ...)
local function pairs2ArrayWithFunc(f, ...)
local args = {}
local args = {}
for _, v in ... do
for _, v in ... do
table.insert(args, tonumberOrString(v))
table.insert(args, f(v))
end
end
return (f(unpack(args)))
return args
end

local function pairs2Array(...)
local args = {}
for _, v in ... do
table.insert(args, v)
end
return args
end
end


Line 71: Line 79:
end
end
return G
return G
end

local function call(s, args, ret)
if ret then
return ({get(s)(unpack(args))})[tonumber(ret)]
end
return get(s)(unpack(args))
end
end


Line 98: Line 113:
--]]
--]]
function p.call(frame)
function p.call(frame)
return callWithTonumberOrStringOnPairs(get(frame.args[1]),
return call(frame.args[1],
ipairsAtOffset(frame.args, 1)
pairs2ArrayWithFunc(tonumberOrString, ipairsAtOffset(frame.args, 1)),
frame.args['return']
)
end

--[[
------------------------------------------------------------------------------------
-- call_n
--
-- Like call(), but passing all arguments as number
------------------------------------------------------------------------------------
--]]
function p.call_n(frame)
return call(frame.args[1],
pairs2ArrayWithFunc(tonumber, ipairsAtOffset(frame.args, 1)),
frame.args['return']
)
end

--[[
------------------------------------------------------------------------------------
-- call_s
--
-- Like call(), but passing all arguments as string (no conversion)
------------------------------------------------------------------------------------
--]]
function p.call_s(frame)
-- unpack() not work on metatable
-- enclosing result in (), so that it will return only 1st element of result
--return (get(frame.args[1])(unpack(frame.args, 2)))
return call(frame.args[1],
pairs2Array(ipairsAtOffset(frame.args, 1)),
frame.args['return']
)
)
end
end