summaryrefslogtreecommitdiffstats
path: root/aconf/model/node.lua
diff options
context:
space:
mode:
Diffstat (limited to 'aconf/model/node.lua')
-rw-r--r--aconf/model/node.lua47
1 files changed, 40 insertions, 7 deletions
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)