<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>http://naija.elizia.net/index.php?action=history&amp;feed=atom&amp;title=Module%3AParam%C3%A8tres</id>
	<title>Module:Paramètres - Revision history</title>
	<link rel="self" type="application/atom+xml" href="http://naija.elizia.net/index.php?action=history&amp;feed=atom&amp;title=Module%3AParam%C3%A8tres"/>
	<link rel="alternate" type="text/html" href="http://naija.elizia.net/index.php?title=Module:Param%C3%A8tres&amp;action=history"/>
	<updated>2026-10-19T07:49:56Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.35.0-rc.0</generator>
	<entry>
		<id>http://naija.elizia.net/index.php?title=Module:Param%C3%A8tres&amp;diff=272&amp;oldid=prev</id>
		<title>Root: 1 revision imported</title>
		<link rel="alternate" type="text/html" href="http://naija.elizia.net/index.php?title=Module:Param%C3%A8tres&amp;diff=272&amp;oldid=prev"/>
		<updated>2020-08-07T13:09:05Z</updated>

		<summary type="html">&lt;p&gt;1 revision imported&lt;/p&gt;
&lt;table class=&quot;diff diff-contentalign-left diff-editfont-monospace&quot; data-mw=&quot;interface&quot;&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 13:09, 7 August 2020&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-notice&quot; lang=&quot;en&quot;&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;(No difference)&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</summary>
		<author><name>Root</name></author>
	</entry>
	<entry>
		<id>http://naija.elizia.net/index.php?title=Module:Param%C3%A8tres&amp;diff=271&amp;oldid=prev</id>
		<title>Mediawiki&gt;Darmo117 at 13:46, 10 May 2020</title>
		<link rel="alternate" type="text/html" href="http://naija.elizia.net/index.php?title=Module:Param%C3%A8tres&amp;diff=271&amp;oldid=prev"/>
		<updated>2020-05-10T13:46:49Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;local m_table = require(&amp;quot;Module:table&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
local export = {}&lt;br /&gt;
&lt;br /&gt;
-- Types&lt;br /&gt;
export.NUMBER = &amp;quot;number&amp;quot;&lt;br /&gt;
export.INT = &amp;quot;int&amp;quot;&lt;br /&gt;
export.FLOAT = &amp;quot;float&amp;quot;&lt;br /&gt;
export.BOOLEAN = &amp;quot;boolean&amp;quot;&lt;br /&gt;
&lt;br /&gt;
-- Constantes d’erreur&lt;br /&gt;
export.UNKNOWN_PARAM = &amp;quot;unknown parameter&amp;quot;&lt;br /&gt;
export.MISSING_PARAM = &amp;quot;missing required parameter&amp;quot;&lt;br /&gt;
export.EMPTY_PARAM = &amp;quot;empty required parameter&amp;quot;&lt;br /&gt;
export.INVALID_VALUE = &amp;quot;invalid value&amp;quot;&lt;br /&gt;
export.VALUE_NOT_IN_ENUM = &amp;quot;value not in enum&amp;quot;&lt;br /&gt;
export.INVALID_TYPE = &amp;quot;invalid type&amp;quot;&lt;br /&gt;
export.ALIAS_TO_UNKNOWN = &amp;quot;alias to undefined parameter&amp;quot;&lt;br /&gt;
export.ALIAS_TO_ALIAS = &amp;quot;alias to alias parameter&amp;quot;&lt;br /&gt;
export.ALIAS_TO_ITSELF = &amp;quot;alias to itself&amp;quot;&lt;br /&gt;
export.ENUM_WITH_CHECKER = &amp;quot;enum with checker&amp;quot;&lt;br /&gt;
export.ENUM_INVALID_VALUE = &amp;quot;invalid enum values&amp;quot;&lt;br /&gt;
&lt;br /&gt;
--- Liste des erreurs non masquées par le mode silencieux.&lt;br /&gt;
local UNCATCHABLE_ERRORS = {&lt;br /&gt;
  export.INVALID_TYPE,&lt;br /&gt;
  export.ALIAS_TO_UNKNOWN,&lt;br /&gt;
  export.ALIAS_TO_ALIAS,&lt;br /&gt;
  export.ALIAS_TO_ITSELF,&lt;br /&gt;
  export.ENUM_WITH_CHECKER,&lt;br /&gt;
  export.ENUM_INVALID_VALUE,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
--- Liste des templates de messages d’erreur.&lt;br /&gt;
local ERROR_MESSAGES = {&lt;br /&gt;
  [export.UNKNOWN_PARAM] = &amp;quot;Paramètre « %s » inconnu&amp;quot;,&lt;br /&gt;
  [export.MISSING_PARAM] = &amp;quot;Paramètre requis « %s » absent&amp;quot;,&lt;br /&gt;
  [export.EMPTY_PARAM] = &amp;quot;Paramètre requis « %s » vide&amp;quot;,&lt;br /&gt;
  [export.INVALID_VALUE] = &amp;#039;Valeur invalide pour le paramètre « %s » (&amp;quot;%s&amp;quot;) de type %s&amp;#039;,&lt;br /&gt;
  [export.VALUE_NOT_IN_ENUM] = &amp;#039;Valeur invalide pour le paramètre « %s » (&amp;quot;%s&amp;quot;)&amp;#039;,&lt;br /&gt;
  [export.INVALID_TYPE] = &amp;#039;Type inconnu pour le paramètre « %s » (&amp;quot;%s&amp;quot;)&amp;#039;,&lt;br /&gt;
  [export.ALIAS_TO_UNKNOWN] = &amp;#039;Paramètre « %s », alias vers un paramètre non défini « %s »&amp;#039;,&lt;br /&gt;
  [export.ALIAS_TO_ALIAS] = &amp;#039;Paramètre « %s », alias vers un autre alias (« %s »)&amp;#039;,&lt;br /&gt;
  [export.ALIAS_TO_ITSELF] = &amp;#039;Paramètre « %s », alias vers lui-même&amp;#039;,&lt;br /&gt;
  [export.ENUM_WITH_CHECKER] = &amp;quot;Le paramètre « %s » est une énumération avec une précondition&amp;quot;,&lt;br /&gt;
  [export.ENUM_INVALID_VALUE] = &amp;#039;Valeur énumérée invalide pour le paramètre « %s » (&amp;quot;%s&amp;quot;) de type %s&amp;#039;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
--- Construit l’objet d’erreur.&lt;br /&gt;
--- @param errorType string Le type de l’erreur.&lt;br /&gt;
--- @vararg any Les données pour formater le message d’erreur.&lt;br /&gt;
--- @return table Un objet contenant le type d’erreur à l’indice &amp;quot;error_type&amp;quot; et les autres données à l’indice &amp;quot;error_data&amp;quot;.&lt;br /&gt;
local function buildErrorMessage(errorType, ...)&lt;br /&gt;
  return {&lt;br /&gt;
    [&amp;quot;errorType&amp;quot;] = errorType,&lt;br /&gt;
    [&amp;quot;errorData&amp;quot;] = { ... }&lt;br /&gt;
  }&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--- Convertit une chaine en booléen.&lt;br /&gt;
--- true = &amp;quot;1&amp;quot;, &amp;quot;oui&amp;quot; ou &amp;quot;vrai&amp;quot;&lt;br /&gt;
--- false = &amp;quot;0&amp;quot;, &amp;quot;non&amp;quot; ou &amp;quot;faux&amp;quot;&lt;br /&gt;
--- @param argValue string La valeur à convertir.&lt;br /&gt;
--- @param argName string Le nom de l’argument correspondant à la valeur.&lt;br /&gt;
--- @param frTypeName string Le type attendu en français.&lt;br /&gt;
--- @return boolean La valeur booléenne du premier argument.&lt;br /&gt;
local function toBoolean(argValue, argName, frTypeName, errorType)&lt;br /&gt;
  if m_table.contains({ &amp;quot;1&amp;quot;, &amp;quot;oui&amp;quot;, &amp;quot;vrai&amp;quot; }, argValue) then&lt;br /&gt;
    return true&lt;br /&gt;
  elseif m_table.contains({ &amp;quot;0&amp;quot;, &amp;quot;non&amp;quot;, &amp;quot;faux&amp;quot; }, argValue) then&lt;br /&gt;
    return false&lt;br /&gt;
  else&lt;br /&gt;
    error(buildErrorMessage(errorType, argName, argValue, frTypeName))&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--- Convertit une chaine en nombre.&lt;br /&gt;
--- @param argValue string La valeur à convertir.&lt;br /&gt;
--- @param argName string Le nom de l’argument correspondant à la valeur.&lt;br /&gt;
--- @param toInt boolean Indique si le nombre doit être un entier.&lt;br /&gt;
--- @param frTypeName string Le type attendu en français.&lt;br /&gt;
--- @return number La valeur numérique du premier argument.&lt;br /&gt;
local function toNumber(argValue, argName, toInt, frTypeName, errorType)&lt;br /&gt;
  local val = tonumber(argValue)&lt;br /&gt;
&lt;br /&gt;
  if val ~= nil then&lt;br /&gt;
    if not toInt or toInt and val == math.floor(val) then&lt;br /&gt;
      return val&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  error(buildErrorMessage(errorType, argName, argValue, frTypeName))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function getValue(expectedType, rawValue, argName, errorType)&lt;br /&gt;
  local value, frTypeName&lt;br /&gt;
&lt;br /&gt;
  -- Vérification des types des arguments.&lt;br /&gt;
  if expectedType == nil then&lt;br /&gt;
    frTypeName = &amp;quot;chaine&amp;quot;&lt;br /&gt;
    if type(rawValue) ~= &amp;quot;string&amp;quot; then&lt;br /&gt;
      error(buildErrorMessage(errorType, argName, rawValue, frTypeName))&lt;br /&gt;
    end&lt;br /&gt;
    value = rawValue&lt;br /&gt;
  elseif expectedType == export.NUMBER then&lt;br /&gt;
    frTypeName = &amp;quot;nombre&amp;quot;&lt;br /&gt;
    value = toNumber(rawValue, argName, false, frTypeName, errorType)&lt;br /&gt;
  elseif expectedType == export.INT then&lt;br /&gt;
    frTypeName = &amp;quot;entier&amp;quot;&lt;br /&gt;
    value = toNumber(rawValue, argName, true, frTypeName, errorType)&lt;br /&gt;
  elseif expectedType == export.FLOAT then&lt;br /&gt;
    frTypeName = &amp;quot;flottant&amp;quot;&lt;br /&gt;
    value = toNumber(rawValue, argName, false, frTypeName, errorType)&lt;br /&gt;
  elseif expectedType == export.BOOLEAN then&lt;br /&gt;
    frTypeName = &amp;quot;booléen&amp;quot;&lt;br /&gt;
    value = toBoolean(rawValue, argName, frTypeName, errorType)&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  return value, frTypeName&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--- Vérifie la validité des définitions des paramètres.&lt;br /&gt;
--- @param definedParameters table La définition des paramètres.&lt;br /&gt;
local function checkParametersDefinitions(definedParameters)&lt;br /&gt;
  local validTypes = { export.BOOLEAN, export.NUMBER, export.INT, export.FLOAT }&lt;br /&gt;
&lt;br /&gt;
  for paramName, paramValue in pairs(definedParameters) do&lt;br /&gt;
    if paramValue.type and not m_table.contains(validTypes, paramValue.type) then&lt;br /&gt;
      error(buildErrorMessage(export.INVALID_TYPE, paramName, paramValue.type))&lt;br /&gt;
    end&lt;br /&gt;
    if paramValue.enum then&lt;br /&gt;
      if paramValue.checker then&lt;br /&gt;
        error(buildErrorMessage(export.ENUM_WITH_CHECKER, paramName))&lt;br /&gt;
      else&lt;br /&gt;
        for _, enumValue in ipairs(paramValue.enum) do&lt;br /&gt;
          -- Vérification du type de la valeur.&lt;br /&gt;
          getValue(paramValue.type, enumValue, paramName, export.ENUM_INVALID_VALUE)&lt;br /&gt;
        end&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if paramValue.alias_of then&lt;br /&gt;
      local alias = paramValue.alias_of&lt;br /&gt;
&lt;br /&gt;
      if not definedParameters[alias] then&lt;br /&gt;
        error(buildErrorMessage(export.ALIAS_TO_UNKNOWN, paramName, paramValue.alias_of))&lt;br /&gt;
      elseif alias == paramName then&lt;br /&gt;
        error(buildErrorMessage(export.ALIAS_TO_ITSELF, paramName))&lt;br /&gt;
      elseif definedParameters[alias].alias_of then&lt;br /&gt;
        error(buildErrorMessage(export.ALIAS_TO_ALIAS, paramName, paramValue.alias_of))&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--- Extrait la clé de l’argument donné après avoir résolu l’alias éventuel.&lt;br /&gt;
--- @param param table La définition du paramètre.&lt;br /&gt;
--- @param processedArgs table Les paramètres en cours de traitement.&lt;br /&gt;
--- @param argName string Le nom du paramètre.&lt;br /&gt;
--- @return string|nil Le nom du paramètre à utiliser ou nil si le paramètre&lt;br /&gt;
---                    est un alias dont l’argument de base a déjà une valeur.&lt;br /&gt;
local function extractArgumentKey(param, processedArgs, argName)&lt;br /&gt;
  local key&lt;br /&gt;
&lt;br /&gt;
  if param.alias_of then&lt;br /&gt;
    -- L’alias n’écrase pas la valeur du paramètre de base.&lt;br /&gt;
    if processedArgs[param.alias_of] == nil then&lt;br /&gt;
      key = param.alias_of&lt;br /&gt;
    end&lt;br /&gt;
  else&lt;br /&gt;
    key = argName&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  return key&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--- Extrait la valeur de l’argument donné.&lt;br /&gt;
--- @param param table La définition du paramètre.&lt;br /&gt;
--- @param key string Le nom de l’argument après résolution de l’alias.&lt;br /&gt;
--- @param argName string Le nom de l’argument de base.&lt;br /&gt;
--- @param processedArgs table Les arguments en cours de traitement.&lt;br /&gt;
local function extractArgumentValue(param, key, argName, argValue, processedArgs)&lt;br /&gt;
  if argValue then&lt;br /&gt;
    argValue = mw.text.trim(argValue)&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  if argValue == &amp;quot;&amp;quot; then&lt;br /&gt;
    -- Un paramètre requis vide doit avoir la propriété allow_empty à true&lt;br /&gt;
    -- pour ne pas lancer d’erreur.&lt;br /&gt;
    if param.required and param.allow_empty or not param.required then&lt;br /&gt;
      argValue = nil&lt;br /&gt;
      processedArgs[key] = nil&lt;br /&gt;
    else&lt;br /&gt;
      error(buildErrorMessage(export.EMPTY_PARAM, argName))&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  if argValue then&lt;br /&gt;
    -- Récupération de la valeur après transtypage éventuel.&lt;br /&gt;
    local value, frTypeName = getValue(param.type, argValue, key, export.INVALID_VALUE)&lt;br /&gt;
    -- Vérification des contraintes d’énumération ou de la précondition.&lt;br /&gt;
    if type(param.enum) == &amp;quot;table&amp;quot; and not m_table.contains(param.enum, value) then&lt;br /&gt;
      error(buildErrorMessage(export.VALUE_NOT_IN_ENUM, argName, value))&lt;br /&gt;
    elseif type(param.checker) == &amp;quot;function&amp;quot; and not param.checker(value) then&lt;br /&gt;
      error(buildErrorMessage(export.INVALID_VALUE, argName, value, frTypeName))&lt;br /&gt;
    end&lt;br /&gt;
    processedArgs[key] = value&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--- Traite les arguments.&lt;br /&gt;
--- @param args table Les arguments à traiter.&lt;br /&gt;
--- @param definedParameters table La définition des paramètres.&lt;br /&gt;
--- @return table Les arguments traités.&lt;br /&gt;
local function parseArguments(args, definedParameters)&lt;br /&gt;
  local processedArgs = {}&lt;br /&gt;
&lt;br /&gt;
  for argName, argValue in pairs(args) do&lt;br /&gt;
    local param = definedParameters[argName]&lt;br /&gt;
&lt;br /&gt;
    if param then&lt;br /&gt;
      local key = extractArgumentKey(param, processedArgs, argName)&lt;br /&gt;
      if key then&lt;br /&gt;
        extractArgumentValue(param, key, argName, argValue, processedArgs)&lt;br /&gt;
      end&lt;br /&gt;
    else&lt;br /&gt;
      -- Les paramètres non définis lancent une erreur.&lt;br /&gt;
      error(buildErrorMessage(export.UNKNOWN_PARAM, argName))&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  return processedArgs&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--- Vérifie que les paramètre requis sont effectivement renseignés.&lt;br /&gt;
--- @param processedArgs table Les arguments retournés par la fonction parse_args.&lt;br /&gt;
--- @param definedParameters table La définition des paramètres.&lt;br /&gt;
local function checkRequiredParameters(processedArgs, definedParameters)&lt;br /&gt;
  for paramName, paramValue in pairs(definedParameters) do&lt;br /&gt;
    if processedArgs[paramName] == nil and paramValue.alias_of == nil then&lt;br /&gt;
      if paramValue.required and not paramValue.allow_empty then&lt;br /&gt;
        error(buildErrorMessage(export.MISSING_PARAM, paramName))&lt;br /&gt;
      elseif paramValue.default ~= nil then&lt;br /&gt;
        processedArgs[paramName] = paramValue.default&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--- Fonction permettant de traiter les arguments du module appelant.&lt;br /&gt;
--- Pour plus de détails, voir la documentation du module.&lt;br /&gt;
--- @param args table Les arguments du module appelant.&lt;br /&gt;
--- @param definedParameters table Les paramètres définis.&lt;br /&gt;
--- @param silentErrors boolean Si true, les paramètres problématiques sont retournés au lieu de lancer une erreur ; ne devrait être utilisé que dans le cas où un comportement précis est nécessaire.&lt;br /&gt;
--- @return table|string|number,boolean Une table contenant les paramètres traités ou le nom du paramètre ayant déclanché une erreur et un booléen indiquant le statut.&lt;br /&gt;
function export.process(args, definedParameters, silentErrors)&lt;br /&gt;
  local success, result = pcall(function()&lt;br /&gt;
    checkParametersDefinitions(definedParameters)&lt;br /&gt;
    local processedArgs = parseArguments(args, definedParameters)&lt;br /&gt;
    checkRequiredParameters(processedArgs, definedParameters)&lt;br /&gt;
    return processedArgs&lt;br /&gt;
  end)&lt;br /&gt;
&lt;br /&gt;
  if not success then&lt;br /&gt;
    local errorType = result.errorType&lt;br /&gt;
    local errorData = result.errorData&lt;br /&gt;
    local errorMessage = mw.ustring.format(ERROR_MESSAGES[errorType], unpack(errorData))&lt;br /&gt;
&lt;br /&gt;
    if silentErrors and not m_table.contains(UNCATCHABLE_ERRORS, errorType) then&lt;br /&gt;
      local argName = errorData[1]&lt;br /&gt;
      local argValue = type(argName) == &amp;quot;number&amp;quot; and tonumber(argName) or argName&lt;br /&gt;
&lt;br /&gt;
      return { argValue, errorType, errorMessage }, false&lt;br /&gt;
&lt;br /&gt;
      -- Ajout d’une mention pour les erreurs internes.&lt;br /&gt;
    elseif m_table.contains(UNCATCHABLE_ERRORS, errorType) then&lt;br /&gt;
      errorMessage = &amp;quot;Erreur interne : &amp;quot; .. errorMessage&lt;br /&gt;
    end&lt;br /&gt;
    -- Suppression de la trace de l’erreur, on garde juste le message.&lt;br /&gt;
    error(errorMessage, 0)&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  return result, true&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return export&lt;/div&gt;</summary>
		<author><name>Mediawiki&gt;Darmo117</name></author>
	</entry>
</feed>