diff options
author | Jo-Philipp Wich <jo@mein.io> | 2016-08-04 11:37:13 +0200 |
---|---|---|
committer | Jo-Philipp Wich <jo@mein.io> | 2016-08-04 11:45:30 +0200 |
commit | 240b8c4b6e5597f3f89f4382df49c123ab114c46 (patch) | |
tree | 69659066ce9e75be45b3d9842ccf9fa3f7593f11 /modules/luci-base/luasrc/util.lua | |
parent | 1367f7b624e9ee926cdbd3235a9fec4450c904b5 (diff) |
luci-base: improve string format error reporting
In mod metamethod, execute string format under pcall() and rethrow error in
caller context to report caller of function in errors and not the meta
method itself.
Signed-off-by: Jo-Philipp Wich <jo@mein.io>
Diffstat (limited to 'modules/luci-base/luasrc/util.lua')
-rw-r--r-- | modules/luci-base/luasrc/util.lua | 19 |
1 files changed, 16 insertions, 3 deletions
diff --git a/modules/luci-base/luasrc/util.lua b/modules/luci-base/luasrc/util.lua index 896e36b45..0e7334be8 100644 --- a/modules/luci-base/luasrc/util.lua +++ b/modules/luci-base/luasrc/util.lua @@ -16,7 +16,7 @@ local _ubus_connection = nil local getmetatable, setmetatable = getmetatable, setmetatable local rawget, rawset, unpack = rawget, rawset, unpack -local tostring, type, assert = tostring, type, assert +local tostring, type, assert, error = tostring, type, assert, error local ipairs, pairs, next, loadstring = ipairs, pairs, next, loadstring local require, pcall, xpcall = require, pcall, xpcall local collectgarbage, get_memory_limit = collectgarbage, get_memory_limit @@ -27,14 +27,27 @@ module "luci.util" -- Pythonic string formatting extension -- getmetatable("").__mod = function(a, b) + local ok, res + if not b then return a elseif type(b) == "table" then + local k, _ for k, _ in pairs(b) do if type(b[k]) == "userdata" then b[k] = tostring(b[k]) end end - return a:format(unpack(b)) + + ok, res = pcall(a.format, a, unpack(b)) + if not ok then + error(res, 2) + end + return res else if type(b) == "userdata" then b = tostring(b) end - return a:format(b) + + ok, res = pcall(a.format, a, b) + if not ok then + error(res, 2) + end + return res end end |