diff options
Diffstat (limited to 'acf/model/node.lua')
| -rw-r--r-- | acf/model/node.lua | 39 |
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 |
