diff options
Diffstat (limited to 'acf/model/node.lua')
-rw-r--r-- | acf/model/node.lua | 34 |
1 files changed, 23 insertions, 11 deletions
diff --git a/acf/model/node.lua b/acf/model/node.lua index b73cf52..748b20d 100644 --- a/acf/model/node.lua +++ b/acf/model/node.lua @@ -53,9 +53,10 @@ function TreeNode:init(context) local mt = getmetatable(self) update(mt, context) - function mt.set(k, v) rawset(self, k, v) end + function mt.save(k, v) rawset(self, k, v) end + function mt.get(k, create) return mt.load(k, create) end function mt.__index(t, k) return mt.get(k) end - function mt.__newindex(t, k, v) mt.set(k, v) end + function mt.__newindex(t, k, v) mt.save(k, v) end function mt.has_permission(user, permission) local p = permission..mt.path @@ -72,19 +73,28 @@ function TreeNode:init(context) mt.txn.validable[mt.path] = mt.addr end -function TreeNode:search(path) +function TreeNode:search(path, create) + if type(path) == 'string' then path = pth.split(path) end + if #path == 0 then return self end - local cpath = getmetatable(self).path + local mt = getmetatable(self) local name = path[1] - local next = self[name] - if next == nil then raise(cpath, 'Subordinate does not exist: '..name) end + if not mt.has_field(name) then + raise(mt.path, 'Field does not exist: '..name) + end + + local next = mt.get(name, create) + if next == nil and (not create or #path > 1) then + raise(mt.path, 'Subordinate does not exist: '..name) + end table.remove(path, 1) if #path > 0 and type(next) ~= 'table' then - raise(pth.join(cpath, name), 'Is a primitive value') + raise(pth.join(mt.path, name), 'Is a primitive value') end - return TreeNode.search(next, path) + + return TreeNode.search(next, path, create) end @@ -100,6 +110,8 @@ function Collection:init(context, params) mt.field = BoundField(self, params.field) mt.meta = {type='collection', members=mt.field:meta('$')} + + function mt.has_field(name) return true end function mt.mmeta(name) return mt.meta.members end function mt.members() return mt.txn:get(mt.addr) or {} end @@ -109,8 +121,8 @@ function Collection:init(context, params) end end - function mt.get(k) return mt.field:load(k) end - function mt.set(k, v) mt.field:save(k, v) end + function mt.load(k, create) return mt.field:load(k, create) end + function mt.save(k, v) mt.field:save(k, v) end end @@ -148,6 +160,6 @@ function pairs(tbl) if not object.isinstance(tbl, TreeNode) then return rawpairs(tbl) end local mt = getmetatable(tbl) local res = {} - for _, member in ipairs(mt.members()) do res[member] = mt.get(member) end + for _, member in ipairs(mt.members()) do res[member] = mt.load(member) end return rawpairs(res) end |