local M = {}
local function make_response(text)
return { text = text, model = "mock", latency_ms = 0 }
end
function M.static(text)
return function(_input)
return make_response(text)
end
end
function M.map(mapping)
local sorted_keys = {}
for k in pairs(mapping) do sorted_keys[#sorted_keys + 1] = k end
table.sort(sorted_keys, function(a, b) return #a > #b end)
return function(input)
local text = mapping[input]
if text then
return make_response(text)
end
for _, pattern in ipairs(sorted_keys) do
if input:find(pattern, 1, true) then
return make_response(mapping[pattern])
end
end
return make_response("")
end
end
function M.fn(fn)
return function(input)
return make_response(tostring(fn(input)))
end
end
function M.recording(responses)
if type(responses) ~= "table" or #responses == 0 then
error("mock.recording: responses must be a non-empty list", 2)
end
local log = { calls = {} }
local idx = 0
local provider = function(input)
log.calls[#log.calls + 1] = input
idx = (idx % #responses) + 1
return make_response(responses[idx])
end
return provider, log
end
return M