diff options
Diffstat (limited to 'acf/model/root.lua')
-rw-r--r-- | acf/model/root.lua | 91 |
1 files changed, 0 insertions, 91 deletions
diff --git a/acf/model/root.lua b/acf/model/root.lua deleted file mode 100644 index 17c5cfb..0000000 --- a/acf/model/root.lua +++ /dev/null @@ -1,91 +0,0 @@ ---[[ -Copyright (c) 2012-2013 Kaarle Ritvanen -See LICENSE file for license details ---]] - -local M = {} - -local model = require('acf.model.model') -local node = require('acf.model.node') -local object = require('acf.object') -local pth = require('acf.path') - -local util = require('acf.util') -local setdefault = util.setdefault - - -M.RootModel = model.new() - -function M.RootModel:init(txn) - object.super(self, M.RootModel):init{txn=txn, path='/', addr='/null/root'} -end - -function M.RootModel:has_permission(user, permission) - return permission == 'read' -end - -function M.RootModel:meta(path) - local obj = self:fetch(path, true) - if object.isinstance(obj, node.TreeNode) then return node.meta(obj) end - return node.mmeta(self:fetch(pth.parent(path), true), pth.name(path)) -end - - -local _topology = {} -local order = 0 - -function M.topology(addr, create) - local top = _topology - if type(addr) == 'table' then addr = util.copy(addr) - else addr = pth.split(addr) end - - local function defaults(top) - return util.setdefaults(top, {members={}, paths={}, referrers={}}) - end - - while #addr > 0 do - if create then - top = setdefault(defaults(top).members, addr[1], {}) - else - top = top.members[addr[1]] or top.members[pth.wildcard] - if not top then return end - end - table.remove(addr, 1) - end - - return defaults(top) -end - -function M.register(name, field, params) - if not params then params = {} end - params.create = true - M.RootModel[name] = model.to_field(field, params) - - local root = M.RootModel() - - for _, record in ipairs(node.topology(root:fetch(name))) do - local top = M.topology(record.addr, true) - - setdefault(top, 'order', order) - order = order + 1 - - local function set(k, v) - setdefault(top, k, v) - assert(top[k] == v) - end - - set('type', record.type) - table.insert(top.paths, record.path) - - if record.scope then - local scope = node.addr( - root:fetch(pth.to_absolute(record.scope, pth.parent(record.path))) - ) - set('scope', scope) - table.insert(M.topology(scope, true).referrers, record.path) - end - end -end - - -return M |