46 lines
1.4 KiB
Lua
46 lines
1.4 KiB
Lua
-- Dormant framework: no missions, events, callbacks or commands are registered
|
|||
|
|
-- until a future migration explicitly calls register on an instance.
|
||
|
|
local ids = require 'shared.mission_ids'
|
||
|
|
|
||
|
|
local Registry = {}
|
||
|
|
Registry.__index = Registry
|
||
|
|
|
||
|
|
function Registry.new()
|
||
|
|
return setmetatable({ missions = {} }, Registry)
|
||
|
|
end
|
||
|
|
|
||
|
|
function Registry:register(mission)
|
||
|
|
assert(type(mission) == 'table' and type(mission.id) == 'string', 'mission.id is required')
|
||
|
|
assert(ids.definitions[mission.id], 'unknown mission ID: ' .. mission.id)
|
||
|
|
assert(not self.missions[mission.id], 'duplicate mission ID: ' .. mission.id)
|
||
|
|
self.missions[mission.id] = mission
|
||
|
|
return mission
|
||
|
|
end
|
||
|
|
|
||
|
|
function Registry:get(missionId)
|
||
|
|
return self.missions[missionId]
|
||
|
|
end
|
||
|
|
|
||
|
|
function Registry:resolveProgPhase(contact, notation)
|
||
|
|
local phase = ids.parseProgPhase(contact, notation)
|
||
|
|
if not phase then return nil end
|
||
|
|
|
||
|
|
local mission = self.missions[phase.missionId]
|
||
|
|
if not mission or not mission.phases or not mission.phases[phase.phaseName] then
|
||
|
|
return nil
|
||
|
|
end
|
||
|
|
|
||
|
|
return mission, mission.phases[phase.phaseName], phase
|
||
|
|
end
|
||
|
|
|
||
|
|
function Registry:list()
|
||
|
|
local result = {}
|
||
|
|
for id, mission in pairs(self.missions) do
|
||
|
|
result[#result + 1] = { id = id, mission = mission }
|
||
|
|
end
|
||
|
|
table.sort(result, function(a, b) return a.id < b.id end)
|
||
|
|
return result
|
||
|
|
end
|
||
|
|
|
||
|
|
return Registry
|