From 1e4cb26264f67b5fe8e3e55e17d1ad785c137f24 Mon Sep 17 00:00:00 2001 From: Kaarle Ritvanen Date: Sun, 22 Feb 2015 00:08:53 +0200 Subject: model: scattered lists --- aconf/model/node.lua | 47 ++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 40 insertions(+), 7 deletions(-) (limited to 'aconf/model') diff --git a/aconf/model/node.lua b/aconf/model/node.lua index 735e7df..d1e1037 100644 --- a/aconf/model/node.lua +++ b/aconf/model/node.lua @@ -33,15 +33,21 @@ M.BoundMember = class() function M.BoundMember:init(parent, name, field) local pmt = getmetatable(parent) - local addr = field.addr or address.escape(name) - if type(addr) == 'function' then addr = addr(pmt.path, name) end + if pmt.maddr and name ~= address.wildcard then self.addr = pmt.maddr(name) + else + self.addr = field.addr or address.escape(name) + if type(self.addr) == 'function' then + self.addr = self.addr(pmt.path, name) + end + self.addr = address.to_absolute(self.addr, pmt.addr) + end local context = { txn=pmt.txn, privileged=pmt.privileged, parent=parent, path=pth.join(pmt.path, name), - addr=address.to_absolute(addr, pmt.addr) + addr=self.addr } local mt = {} @@ -268,9 +274,9 @@ function M.Collection:init(context, params) self.init = nil local mt = getmetatable(self) - local field = M.BoundMember(self, pth.wildcard, params.field) + mt.field = M.BoundMember(self, pth.wildcard, params.field) - function mt.topology() return field:topology() end + function mt.topology() return mt.field:topology() end function mt.member(name) return M.BoundMember(self, name, params.field) @@ -287,7 +293,7 @@ function M.Collection:init(context, params) meta, { editable=params.editable and mt.has_permission('create'), - members=field:meta(), + members=mt.field:meta(), required=params.required, ['ui-member']=params.ui_member or meta['ui-name']:gsub('s$', ''), widget=params.layout @@ -364,8 +370,35 @@ function M.List:init(context, params) super(self, M.List):init(context, setdefaults(params, {dtype='list'})) local mt = getmetatable(self) - local tmt = getmetatable(mt.escalate) + if not mt.txn then return end + + local function expand() return mt.txn:expand(mt.field.addr) end + + function mt.maddr(i) + local addrs = expand() + + if not addrs[1] then + addrs[1] = address.join( + '/', + table.unpack( + util.map( + function(c) return c == address.wildcard and 1 or c end, + address.split(mt.field.addr) + ) + ) + ) + end + if addrs[i] then return addrs[i] end + + local comps = address.split(addrs[#addrs]) + comps[#comps] = comps[#comps] + i - #addrs + return address.join('/', table.unpack(comps)) + end + + function mt.members() return util.keys(expand()) end + + local tmt = getmetatable(mt.escalate) mt._save = mt.save local function check_index(i, max) -- cgit v1.2.3