* luci/libs/uvl:
authorJo-Philipp Wich <jow@openwrt.org>
Wed, 3 Sep 2008 21:49:13 +0000 (21:49 +0000)
committerJo-Philipp Wich <jow@openwrt.org>
Wed, 3 Sep 2008 21:49:13 +0000 (21:49 +0000)
- 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

libs/uvl/luasrc/uvl.lua
libs/uvl/luasrc/uvl/datatypes.lua
libs/uvl/luasrc/uvl/errors.lua
libs/uvl/root/lib/uci/schema/default/firewall
libs/uvl/root/lib/uci/schema/meta/schema

index 908cfd7bd2dd91f2bc45a8d2f8eaecad5a637d85..007a37dbc442d75c921227284a4a293a1734f4da 100644 (file)
@@ -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.
index 3dfe37dbef82c9252eaddfc9d1625fc22f84956a..ce18d47ed4ae1a0447953678fc616ed27f85627d 100644 (file)
@@ -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
index 2ababaa617cca35ba58229778c5d4f5ada55a1e5..c53a4abe09d3893ef972815989e5e37ebe782a0f 100644 (file)
@@ -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"' },
index dc488d40fd1b6f7967cb792b5194ada9976e28ae..e421b1103098071f95480a930d73c05b1790e054 100644 (file)
@@ -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'
index 90681245444820080919d3181db47c46d2ca07f3..1d673d3502fdf5f83c235916d9e0869619eb6d00 100644 (file)
@@ -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'