Util.lua
57 lines
local HttpService = game:GetService("HttpService")
local Util = {}
function Util.DeepCopy(value, seen)
if type(value) ~= "table" then
return value
end
seen = seen or {}
if seen[value] then
error("NexusData does not support cyclic tables")
end
seen[value] = true
local copy = {}
for key, item in pairs(value) do
if type(key) == "table" or type(key) == "userdata" or type(key) == "function" then
error("NexusData only supports serializable table keys")
end
copy[key] = Util.DeepCopy(item, seen)
end
seen[value] = nil
return copy
end
function Util.Reconcile(data, template)
for key, value in pairs(template) do
if data[key] == nil then
data[key] = Util.DeepCopy(value)
elseif type(data[key]) == "table" and type(value) == "table" then
Util.Reconcile(data[key], value)
end
end
return data
end
function Util.IsValidKey(key)
return type(key) == "string" or type(key) == "number"
end
function Util.Encode(value)
local ok, encoded = pcall(function()
return HttpService:JSONEncode(value)
end)
if ok then
return encoded
end
return nil, encoded
end
function Util.Backoff(attempt, baseDelay, maxDelay)
return math.min(baseDelay * (2 ^ (attempt - 1)), maxDelay) + math.random() * 0.25
end
return Util