]]--
-module( "luci.uvl.dependencies", package.seeall )
+local uvl = require "luci.uvl"
+local ERR = require "luci.uvl.errors"
+local util = require "luci.util"
+local table = require "table"
+
+local type, unpack = type, unpack
+local ipairs, pairs = ipairs, pairs
+
+module "luci.uvl.dependencies"
+
-local ERR = luci.uvl.errors
function _parse_reference( r, c, s, o )
local ref = { }
}
for v in r:gmatch("[^.]+") do
- table.insert(ref, (v:gsub( "%$(.+)", vars )))
+ ref[#ref+1] = (v:gsub( "%$(.+)", vars ))
end
-
+
if #ref < 2 then
table.insert(ref, 1, s or '$section')
end
function _serialize_dependency( dep, v )
local str
- for k, v in luci.util.spairs( dep,
+ for k, v in util.spairs( dep,
function(a,b)
a = ( type(dep[a]) ~= "boolean" and "_" or "" ) .. a
b = ( type(dep[b]) ~= "boolean" and "_" or "" ) .. b
for _, dep in ipairs(object:scheme('depends')) do
local subcondition = true
- for k, v in pairs(dep) do
+ local score = 0
+
+ for k, v in util.spairs(
+ dep, function(a, b) return type(dep[a]) == "string" end
+ ) do
-- XXX: better error
local ref = _parse_reference( k, unpack(object.cref) )
return false, derr:child(ERR.SME_BADDEP(object,k))
end
- local option = luci.uvl.option( self, object.c, unpack(ref) )
+ local option = uvl.option( self, object.c, unpack(ref) )
valid, err = self:_validate_option( option, true )
if valid then
derr:child(
type(v) == "boolean"
and ERR.DEP_NOVALUE(option, depstr)
- or ERR.DEP_NOTEQUAL(option, {depstr, v})
+ or ERR.DEP_NOTEQUAL(option, {depstr, v}),
+ score
)
- break
+ --break
+ else
+ score = score + ( type(v) == "boolean" and 1 or 10 )
end
else
subcondition = false