* luci/libs: uvl: implement dependencies for enum values

This commit is contained in:
Jo-Philipp Wich 2008-08-25 18:30:25 +00:00
parent 1e6001c235
commit 8e6d1e682a
2 changed files with 68 additions and 1 deletions

View file

@ -352,7 +352,7 @@ function UVL._validate_option( self, option, nodeps )
return false,
'Value "%s" of given option "%s" is not defined in %s { %s }'
%{ val or '<nil>', option:cid(), item.type,
table.concat( luci.util.keys(item.values), ", " ) }
table.concat( luci.util.keys(item.values or {}), ", " ) }
end
elseif item.type == "list" and val then
if type(val) ~= "table" and STRICT_LIST_TYPE then
@ -609,6 +609,10 @@ function UVL._read_scheme_parts( self, scheme, schemes )
t.values[v.value] = v.title or v.value
end
if not t.enum_depends then
t.enum_depends = { }
end
if v.default then
_assert( not t.default,
'Enum "%s" in scheme "%s", section "%s" redeclares ' ..
@ -617,6 +621,16 @@ function UVL._read_scheme_parts( self, scheme, schemes )
t.default = v.value
end
if v.depends then
t.enum_depends[v.value] = _assert(
self:_read_dependency(
v.depends, t.enum_depends[v.value]
),
'Invalid reference "%s" in "%s.%s.%s.%s"',
v.depends, scheme, r[2], r[3], v.value
)
end
end
end
end

View file

@ -113,5 +113,58 @@ function check( self, object, nodeps )
return false, err
end
if item.type == "enum" and item.enum_depends[object:value()] then
local ok = false
local valid, err = false,
string.format( 'In dependency check for enum value "%s.%s":',
object:cid(), object:value() )
for _, dep in ipairs(item.enum_depends[object:value()]) do
local subcondition = true
for k, v in pairs(dep) do
-- XXX: better error
local ref = _parse_reference( k, unpack(object.cref) )
if not ref then
return false, "Ambiguous dependency reference '" .. k ..
"' for enum '" .. object:sid() .. "." ..
object:value() .. "' given"
end
local option = luci.uvl.option(
self, object.config,
object.config[ref[2]]
and object.config[ref[2]]['.type']
or object.sref[2],
ref[1], ref[2], ref[3]
)
valid, err2 = self:_validate_option( option, true )
if valid then
if not (
( type(v) == "boolean" and object.config[ref[2]][ref[3]] ) or
( ref[3] and object.config[ref[2]][ref[3]] ) == v
) then
subcondition = false
err = err .. "\n" ..
self.log.dump_dependency( dep, ref, v )
break
end
else
subcondition = false
err = err .. "\n" ..
self.log.dump_dependency( dep, ref, nil, err2 )
break
end
end
if subcondition then
return true
end
end
return false, err
end
return true
end