summaryrefslogtreecommitdiffstats
path: root/acf/model/node.lua
diff options
context:
space:
mode:
Diffstat (limited to 'acf/model/node.lua')
-rw-r--r--acf/model/node.lua34
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