A utility module for error-handling, mainly with respect to argument validation.
This module should be lazy-loaded using Module:UtilsPackage so that pages which do not have errors (most pages) do not get added to Special:WhatLinksHere/Module:UtilsError. (This does mean that UtilsPackage gets linked everywhere but it is already anyway.)
local utilsPackage = require("Module:UtilsPackage") local _utilsError = utilsPackage.lazyLoad("Module:UtilsError") ... _utilsError().warn("...")
local p = {}
local s = require("Module:I18n").getString
local utilsMarkup = require("Module:UtilsMarkup/Link")
local utilsTable = require("Module:UtilsTable")
function p.warn(msg)
local callStack = debug.traceback("", 3)
local output = msg .. "\n\n"
for line in string.gmatch(callStack, "\tModule:[^:]*:[^\n]*\n") do
line = string.gsub(line, "\tModule:([^:]*):(.*)", ":::[[Module:%1]]:%2")
output = output .. line .. "\n"
end
mw.addWarning(output)
end
function p.required(...)
local msg = s("msg.required", p.path(...))
p.warn(msg)
return utilsMarkup.category(s("cat.invalidFunctionArguments"))
end
function p.invalid(value, ...)
local msg = s("msg.invalid", value, p.path(...))
p.warn(msg)
return utilsMarkup.category("cat.invalidFunctionArguments")
end
function p.path(...)
local pathComponents = {...}
local path = pathComponents[1]
for _, pathComponent in pairs(utilsTable.tail(pathComponents)) do
path = path .. "[" .. utilsTable.print(pathComponent) .. "]"
end
return path
end
-- Deprecated. Use p.warn()
function p.logWarning(msg)
local caller = ("[[%s]]"):format(p.getRootFrameTitle())
local msg = ("%s: %s"):format(caller, msg)
mw.addWarning(msg)
end
function p.logWarnings(messages)
for _, msg in ipairs(messages) do
p.logWarning(msg)
end
end
function p.getRootFrameTitle()
local frame = mw.getCurrentFrame()
while frame:getParent() do
frame = frame:getParent()
end
return frame:getTitle()
end
p.INVALID_TEMPLATE_ARGUMENTS = "Category:Pages using invalid template arguments"
function p.printErrorCategories(...)
local result = ""
for i,v in ipairs(arg) do
result = ("[[%s]]"):format(tostring(v)) .. result
end
return result
end
Strings = {
en = {
msg = {
required = "<code>%s</code> is required but is <code>nil</code>",
invalid = "Value <code>%s</code> is invalid for <code>%s</code>",
},
cat = {
invalidFunctionArguments = "Category:Pages with invalid function arguments",
},
}
}
return p