From: Jo-Philipp Wich Date: Mon, 25 Aug 2008 18:30:25 +0000 (+0000) Subject: * luci/libs: uvl: implement dependencies for enum values X-Git-Tag: 0.8.0~301 X-Git-Url: https://git.librecmc.org/?a=commitdiff_plain;h=8e6d1e682afee81fb4199ad494195c23e4381af5;p=oweals%2Fluci.git * luci/libs: uvl: implement dependencies for enum values --- diff --git a/libs/uvl/luasrc/uvl.lua b/libs/uvl/luasrc/uvl.lua index ed0bd13e1..aaeb875f5 100644 --- a/libs/uvl/luasrc/uvl.lua +++ b/libs/uvl/luasrc/uvl.lua @@ -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 '', 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 diff --git a/libs/uvl/luasrc/uvl/dependencies.lua b/libs/uvl/luasrc/uvl/dependencies.lua index fc407a985..a84f73c7b 100644 --- a/libs/uvl/luasrc/uvl/dependencies.lua +++ b/libs/uvl/luasrc/uvl/dependencies.lua @@ -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