From: Jo-Philipp Wich Date: Wed, 3 Sep 2008 21:49:13 +0000 (+0000) Subject: * luci/libs/uvl: X-Git-Tag: 0.8.0~170 X-Git-Url: https://git.archive.openwrt.org/?a=commitdiff_plain;h=727e9878fb00f545c0cd1b0130e789a5764eee3b;p=project%2Fluci.git * luci/libs/uvl: - implement host datatype which matches hostname, ip4addr or ip6addr datatype - implement multival flag for options - fix handling of OPT_BADVALUE errors - add multival flag spec to reference scheme --- diff --git a/libs/uvl/luasrc/uvl.lua b/libs/uvl/luasrc/uvl.lua index 908cfd7bd..007a37dbc 100644 --- a/libs/uvl/luasrc/uvl.lua +++ b/libs/uvl/luasrc/uvl.lua @@ -296,14 +296,16 @@ function UVL._validate_option( self, option, nodeps ) if option:scheme('type') == "reference" or option:scheme('type') == "enum" then - if not option:scheme('values') or - not option:scheme('values')[val] - then - return false, option:error( ERR.OPT_BADVALUE( - option, luci.util.serialize_data( - luci.util.keys(option:scheme('values') or {}) - ) - ) ) + local scheme_values = option:scheme('values') or { } + local config_values = ( type(val) == "table" and val or { val } ) + for _, v in ipairs(config_values) do + if not scheme_values[v] then + return false, option:error( ERR.OPT_BADVALUE( + option, { v, luci.util.serialize_data( + luci.util.keys(scheme_values) + ) } + ) ) + end end elseif option:scheme('type') == "list" then if type(val) ~= "table" and STRICT_LIST_TYPE then @@ -1103,7 +1105,11 @@ end --- Get the value of this option. -- @return The associated configuration value function option.value(self) - return self:config() + local v = self:config() + if v and self:scheme('multival') then + v = luci.util.split( v, "%s+", nil, true ) + end + return v end --- Get the associated section information in scheme. diff --git a/libs/uvl/luasrc/uvl/datatypes.lua b/libs/uvl/luasrc/uvl/datatypes.lua index 3dfe37dbe..ce18d47ed 100644 --- a/libs/uvl/luasrc/uvl/datatypes.lua +++ b/libs/uvl/luasrc/uvl/datatypes.lua @@ -111,6 +111,10 @@ function hostname( val ) return false end +function host( val ) + return hostname(val) or ipaddr(val) +end + function string( val ) return true -- Everything qualifies as valid string end diff --git a/libs/uvl/luasrc/uvl/errors.lua b/libs/uvl/luasrc/uvl/errors.lua index 2ababaa61..c53a4abe0 100644 --- a/libs/uvl/luasrc/uvl/errors.lua +++ b/libs/uvl/luasrc/uvl/errors.lua @@ -53,7 +53,7 @@ ERRCODES = { { 'OPT_UNKNOWN', 'Option "%i" (%I) not found in scheme' }, { 'OPT_REQUIRED', 'Required option "%i" has no value' }, - { 'OPT_BADVALUE', 'Value "%v" of option "%i" is not defined in enum %1' }, + { 'OPT_BADVALUE', 'Value "%1" of option "%i" is not defined in enum %2' }, { 'OPT_INVVALUE', 'Value "%v" of given option "%i" does not validate as datatype "%1"' }, { 'OPT_NOTLIST', 'Option "%i" is defined as list but stored as plain value' }, { 'OPT_DATATYPE', 'Option "%i" has unknown datatype "%1"' }, diff --git a/libs/uvl/root/lib/uci/schema/default/firewall b/libs/uvl/root/lib/uci/schema/default/firewall index dc488d40f..e421b1103 100644 --- a/libs/uvl/root/lib/uci/schema/default/firewall +++ b/libs/uvl/root/lib/uci/schema/default/firewall @@ -15,8 +15,8 @@ config variable option name 'network' option title 'Associated network of this firewall zone' option section 'firewall.zone' -# option valueof 'network.interface' -# option type 'lazylist' + option valueof 'network.interface' + option multival true config variable option name 'forward' diff --git a/libs/uvl/root/lib/uci/schema/meta/schema b/libs/uvl/root/lib/uci/schema/meta/schema index 906812454..1d673d350 100644 --- a/libs/uvl/root/lib/uci/schema/meta/schema +++ b/libs/uvl/root/lib/uci/schema/meta/schema @@ -210,6 +210,15 @@ config variable option datatype 'boolean' option required false +# Variable multiple values flag (schema.@variable.multival) +config variable + option name 'multival' + option title 'Specify whether this variable may contain multiple values separated by space' + option section 'schema.variable' + option type 'variable' + option datatype 'boolean' + option required false + # Variable type (schema.@variable.type) config variable option name 'type'