FFGFlash

api/data.lua

Sep 28th, 2021 (edited)
78
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 1.98 KB | None | 0 0
  1. local api = { LoadOrder = 100 }
  2. function api.Build()
  3.   local Data = { Root = "/nekOS/data" }
  4.   Data.__index = Data
  5.   function Data:__call(root)
  6.     root = root or "/"
  7.     local inst = setmetatable({ Root = root }, self)
  8.     return inst
  9.   end
  10.   function Data:require(p) return require(self.Root.."/"..p) end
  11.   function Data:load(f)
  12.     local data = self
  13.     local manager = { Path = data.Root.."/"..f, Data = {}, JSON = false }
  14.     function manager:__call()
  15.       if not rawget(self,"exists")(self) then return false, "File not found." end
  16.       local f = fs.open(rawget(self,"Path"), "r")
  17.       local t = f.readAll();
  18.       f.close()
  19.       local data = {}
  20.       local success,err = pcall(function() data = textutils.unserialize(t) end)
  21.       if not success then return false,err end
  22.       if not data then
  23.         local success,err = pcall(function() data = json:parse(t) end)
  24.         if not success then return false,err end
  25.         if not data then return false,"Couldn't read file." end
  26.         self:object(true)
  27.       end
  28.       rawset(self,"Data",data)
  29.       return true
  30.     end
  31.     function manager:__index(k) return rawget(self,"Data")[k] or rawget(self,k) end
  32.     function manager:__newindex(k,v) rawget(self,"Data")[k]=v end
  33.     function manager:exists() return fs.exists(rawget(self,"Path")) end
  34.     function manager:save(p) return data:save(p or f,rawget(self,"Data"),rawget(self,"JSON")) end
  35.     function manager:object(b) if type(b)~="boolean" then return false,"Parameter #1 only accepts booleans." end rawset(self,"JSON",b) return true end
  36.     manager = setmetatable(manager, manager)
  37.     return manager,manager()
  38.   end
  39.   function Data:save(p,d,j)
  40.     j=j or false
  41.     local s,e = pcall(function() d = j and json:stringify(d) or textutils.serialize(d, { compact = true }) end)
  42.     if not s then return false, e end
  43.     local f = fs.open(self.Root.."/"..p, "w")
  44.     f.write(d)
  45.     f.close()
  46.     return true
  47.   end
  48.   return setmetatable(Data, Data)
  49. end
  50. return api
Add Comment
Please, Sign In to add comment