Saltar para o conteúdo

Módulo:Protect

Origem: Wikipédia, a enciclopédia livre.
Documentação do módulo[ver] [editar] [histórico] [purgar]

Este metamódulo [en] simplifica o tratamento de erros em outros módulos. Ele transforma uma função, que pode gerar um erro, em uma função, que nesse caso retorna uma mensagem de erro especificada.

Uso[editar código-fonte]

 local protect = require('Módulo:Protect')
 local protectedFunc = protect(func, errFormat, options)

Argumentos[editar código-fonte]

  • func
    Função a ser transformada.
  • errFormat (padrão: 'Erro: %s')
    Mensagem de erro personalizada.
    Utilize '%s' para incluir a mensagem a partir de um erro capturado.
  • options – tabela opcional com os seguintes campos:
    • raw (padrão: false)
      Se for verdadeiro (true), então errFormat será usado como está, caso não, será colocado dentro de uma marcação (tag) <strong class="error">.
    • removeLocation (padrão: true)
      Se for verdadeiro (true), remove as informações de localização das mensagens de erro capturadas.

Valor de retorno[editar código-fonte]

O protectedFunc resultante é uma função, que chama a função original func, passando todos os argumentos para ela, e retorna todos os seus valores de retorno. Se func gerar um erro, a mensagem de erro especificada será retornada.

Exemplo[editar código-fonte]

local protect = require('Módulo:Protect')

local p = {}

function p.main(frame)
    if not frame.args[1] then
        error('argumento faltando')
    end
    return frame.args[1]
end

p.main = protect(p.main)

return p

Invocar a função principal sem argumentos resultará em: Erro: argumento faltando

local function processResult(options, success, ...)
	if not success then
		local message = tostring(... or '(nenhuma mensagem)')
		if options.removeLocation then
			message = string.gsub(message, '^Módulo:[^:]+:%d+: ', '', 1)
		end
		return string.format(options.errFormat, message)
	end
	return ...
end

local function protect(func, errFormat, options)
	if type(errFormat) == 'table' then
		options = options or errFormat
		errFormat = nil
	end
	options = mw.clone(options) or {}
	options.errFormat = errFormat or options.errFormat or 'Erro: %s'
	if not options.raw then
		options.errFormat = '<strong class="error">' .. options.errFormat .. '</strong>'
	end
	options.removeLocation = options.removeLocation == nil or options.removeLocation
	
	return function (...)
		return processResult(options, pcall(func, ...))
	end
end

return protect