Files
lmcp/phase1_baseline/versions.lua
T

56 lines
2.0 KiB
Lua

-- versions.lua
-- Modul zur Versionspruefung gemaess LMCP-Vertrag
local M = {}
-- Nur die neue Fassung. Die alte (2025-06-18) existiert nicht mehr: mit
-- SEP-2575 ist `initialize` entfernt, die Verhandlung der alten Fassung
-- damit tot. 2025-06-18 in der Liste zu fuehren waere eine Luege im
-- discover-Response. Dual-Protokoll (alt + neu) ist eine spaetere Phase.
M.SUPPORTED = {"2026-07-28"}
--- Prueft, ob eine Version unterstuetzt wird.
-- @param version Die zu pruefende Version (String oder nil)
-- @return boolean true wenn unterstuetzt, sonst false
-- @return table|nil Fehlerdetails bei Nichtunterstuetzung
function M.check(version)
-- (a) version == nil oder "" -> true, nil
if version == nil or version == "" then
return true, nil
end
-- (b) exakter Treffer in M.SUPPORTED -> true, nil
for _, supported_version in ipairs(M.SUPPORTED) do
if version == supported_version then
return true, nil
end
end
-- (c) alles andere -> false, { code = -32022, data = { supported = <Kopie> } }
--
-- KOPIE, nicht M.SUPPORTED selbst. Vorher ging die Modultabelle nach aussen:
-- ein Aufrufer, der das Fehlerobjekt behaelt und `err.data.supported[1]`
-- ueberschreibt, veraendert die Liste des Moduls fuer JEDEN folgenden
-- Aufruf -- vorgefuehrt am 2026-08-09: nach
-- `e.data.supported[1] = "GEKAPERT"` ist `check("2025-06-18")` falsch und
-- `check("GEKAPERT")` wahr. Vertragsregel 5 ("Ein Aufruf darf die Liste des
-- naechsten nicht verschieben") war damit gebrochen, und Pruefung 5 sah es
-- nicht, weil sie nie ueber die zurueckgegebene Referenz schreibt.
-- Solange das Modul niemand aufrief, war das theoretisch. Seit es an
-- `initialize` haengt, ist es erreichbar.
local kopie = {}
for i = 1, #M.SUPPORTED do
kopie[i] = M.SUPPORTED[i]
end
return false, {
code = -32022,
data = {
supported = kopie
}
}
end
-- Keine neuen Globalen, keine Seiteneffekte, M.SUPPORTED wird nicht geaendert
return M