Skip to content

Instantly share code, notes, and snippets.

@Dryzler
Last active June 27, 2017 15:29
Show Gist options
  • Save Dryzler/141d514e6ccd63fbf9973230e5dd7024 to your computer and use it in GitHub Desktop.
Save Dryzler/141d514e6ccd63fbf9973230e5dd7024 to your computer and use it in GitHub Desktop.
local MAJOR, MINOR = "LibSafe", 1.005
local LibSafe, oldminor = LibStub:NewLibrary(MAJOR, MINOR)
if not LibSafe then return end
LibSafe.addonName = ""
LibSafe.addonTable = nil
LibSafe.savedVariablesName = nil
LibSafe.savedVariables = nil
LibSafe.isDeveloper = false
--static function or instance function
function LibSafe:makeTableSafe(tbl, libSafeObject, isDeveloper)
if not tbl and not self.addonTable then return end
if not tbl then
tbl = self.addonTable
libSafeObject = self
elseif not libSafeObject then
--complete objectless (static) call
end
local writtenFunctions = {}
for k,v in pairs(tbl) do
if not writtenFunctions[k] then
writtenFunctions[k] = true
if type(v) == 'function' then
if libSafeObject then
tbl[k] = function(self, ...)
local ret = {libSafeObject:call(v, ...)}
table.remove(ret, 1)
return unpack(ret)
end
else
tbl[k] = function(self, ...)
local isDeveloperBefore = LibSafe.isDeveloper
LibSafe.isDeveloper = isDeveloper
local ret = {LibSafe:callTable(self, v, ...)}
LibSafe.isDeveloper = isDeveloperBefore
table.remove(ret, 1)
return unpack(ret)
end
end
end
end
end
end
function LibSafe:call(fn, ...)
if self.isDeveloper then
return true, fn(self.addonTable, ...)
end
local args = {...}
return xpcall(function()
return fn(self.addonTable, unpack(args))
end,
function(errobj)
self:errorHandler(errobj)
end)
end
function LibSafe:callFn(fn, ...)
if self.isDeveloper then
return true, fn(...)
end
local args = {...}
return xpcall(function()
return fn(unpack(args))
end,
function(errobj)
self:errorHandler(errobj)
end)
end
function LibSafe:callTable(tbl, fn, ...)
if self.isDeveloper then
return true, fn(tbl, ...)
end
local args = {...}
return xpcall(function()
return fn(tbl, unpack(args))
end,
function(errobj)
self:errorHandler(errobj)
end)
end
function LibSafe.errorHandler(self, errobj)
_G.d(self.addonName..">error: "..tostring(errobj))
if not self.savedVariables then
if self.savedVariablesName then
self.savedVariables = ZO_SavedVars:NewAccountWide(self.savedVariablesName, 1, 'LibSafe', {errors = {}})
end
end
if self.savedVariables and self.savedVariables.errors then
table.insert(self.savedVariables.errors, tostring(errobj))
while #self.savedVariables.errors > 100 do table.remove(self.savedVariables.errors, 1) end
end
return false
end
LibSafe.__index = LibSafe
LibSafe.new = function(addonTable, addonName, savedVariablesName, isDeveloper)
local self = setmetatable({}, LibSafe)
self.addonName = addonName
self.addonTable = addonTable
self.savedVariablesName = savedVariablesName
self.isDeveloper = isDeveloper
return self
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment