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.lua39
1 files changed, 37 insertions, 2 deletions
diff --git a/acf/model/node.lua b/acf/model/node.lua
index 4c05d4d..0e22d63 100644
--- a/acf/model/node.lua
+++ b/acf/model/node.lua
@@ -6,8 +6,10 @@ See LICENSE file for license details
module(..., package.seeall)
local raise = require('acf.error').raise
+
local object = require('acf.object')
local class = object.class
+local isinstance = object.isinstance
local super = object.super
local pth = require('acf.path')
@@ -103,6 +105,38 @@ function TreeNode:fetch(path, create)
return TreeNode.fetch(next, path, create)
end
+function TreeNode:search_refs(path)
+ if type(path) == 'string' then path = pth.split(path) end
+
+ if #path == 0 then return {} end
+
+ local mt = getmetatable(self)
+ local name = path[1]
+ table.remove(path, 1)
+
+ local function collect(name)
+ local next = mt.load(name)
+ if not next then return {} end
+
+ local member = mt.member(name)
+ if member.deleted then return {member} end
+
+ return isinstance(next, TreeNode) and TreeNode.search_refs(
+ next, path
+ ) or {}
+ end
+
+ if name == pth.wildcard then
+ local res = {}
+ for _, member in ipairs(mt.members()) do
+ util.extend(res, collect(member))
+ end
+ return res
+ end
+
+ return collect(name)
+end
+
Collection = class(TreeNode)
@@ -111,6 +145,7 @@ function Collection:init(context, params)
self.init = nil
self.fetch = nil
+ self.search_refs = nil
local mt = getmetatable(self)
local field = BoundMember(self, pth.wildcard, params.field)
@@ -221,7 +256,7 @@ local rawpairs = pairs
local rawipairs = ipairs
function pairs(tbl)
- if not object.isinstance(tbl, TreeNode) then return rawpairs(tbl) end
+ if not isinstance(tbl, TreeNode) then return rawpairs(tbl) end
local mt = getmetatable(tbl)
local res = {}
for _, member in rawipairs(mt.members()) do res[member] = mt.load(member) end
@@ -235,6 +270,6 @@ local function _ipairs(mt, i)
return i, v
end
function ipairs(tbl)
- if not object.isinstance(tbl, TreeNode) then return rawipairs(tbl) end
+ if not isinstance(tbl, TreeNode) then return rawipairs(tbl) end
return _ipairs, getmetatable(tbl), 0
end