2014-07-05 00:48:09 +00:00
local function loadvar ( varname )
2017-10-28 15:05:53 +00:00
local ok , val = pcall ( assert ( loadstring ( ' return domain. ' .. varname ) ) )
if ok and val ~= nil then
return val , ' domains/ ' .. domain_code .. ' .conf '
end
ok , val = pcall ( assert ( loadstring ( ' return site. ' .. varname ) ) )
if ok and val ~= nil then
return val , ' site.conf '
else
return nil , ' site.conf or domains/ ' .. domain_code .. ' .conf '
end
end
local function loadvar_domain ( varname )
local ok , val = pcall ( assert ( loadstring ( ' return domain. ' .. varname ) ) )
2014-07-05 00:48:09 +00:00
if ok then
2017-10-28 15:05:53 +00:00
return val , ' domains/ ' .. domain_code .. ' .conf '
2014-07-05 00:48:09 +00:00
else
2017-10-28 15:05:53 +00:00
return nil , ' domains/ ' .. domain_code .. ' .conf '
end
end
local function loadvar_site ( varname )
ok , val = pcall ( assert ( loadstring ( ' return site. ' .. varname ) ) )
if ok then
return val , ' site.conf '
else
return nil , ' site.conf '
2014-07-05 00:48:09 +00:00
end
end
2016-08-03 08:50:24 +00:00
local function array_to_string ( array )
local string = ' '
for _ , v in ipairs ( array ) do
if # string >= 1 then
string = string .. ' , '
end
string = string .. v
end
return ' [ ' .. string .. ' ] '
end
local function assert_one_of ( var , array , msg )
for _ , v in ipairs ( array ) do
if v == var then
return true
end
end
error ( msg )
end
2014-07-05 00:48:09 +00:00
local function assert_type ( var , t , msg )
assert ( type ( var ) == t , msg )
end
2017-10-28 15:05:53 +00:00
-- returns an unique keys in keys of returned table
function keys_merged ( a , b )
keys_table = { }
for k , _ in pairs ( a or { } ) do
keys_table [ k ] = 1
end
for k , _ in pairs ( b or { } ) do
keys_table [ k ] = 1
end
return keys_table
end
function forbid_in_domain ( varname )
local ok , val = pcall ( assert ( loadstring ( ' return domain. ' .. varname ) ) )
assert ( not ok or val == nil , " domains/ " .. domain_code .. " .conf error: ` " .. varname .. " ` is not allowed in domain specific config. " )
end
function forbid_in_site ( varname )
local ok , val = pcall ( assert ( loadstring ( ' return site. ' .. varname ) ) )
assert ( not ok or val == nil , " site.conf error: ` " .. varname .. " ` is not allowed in site config. " )
end
2014-07-05 00:48:09 +00:00
2017-10-28 15:05:53 +00:00
function assert_uci_name ( var , conf_name )
2015-10-11 17:31:44 +00:00
-- We don't use character classes like %w here to be independent of the locale
2017-10-28 15:05:53 +00:00
assert ( var : match ( ' ^[0-9a-zA-Z_]+$ ' ) , conf_name .. " error: ` " .. var .. " ' is not a valid config section name (only alphanumeric characters and the underscore are allowed) " )
2015-10-11 17:31:44 +00:00
end
2014-07-05 00:48:09 +00:00
function need_string ( varname , required )
2017-10-28 15:05:53 +00:00
local var , conf_name = loadvar ( varname )
2014-07-05 00:48:09 +00:00
if required == false and var == nil then
2017-10-28 15:05:53 +00:00
return nil , conf_name
2014-07-05 00:48:09 +00:00
end
2017-10-28 15:05:53 +00:00
assert_type ( var , ' string ' , conf_name .. " error: expected ` " .. varname .. " ' to be a string " )
return var , conf_name
2014-07-05 00:48:09 +00:00
end
function need_string_match ( varname , pat , required )
2017-10-28 15:05:53 +00:00
local var , conf_name = need_string ( varname , required )
2014-07-05 00:48:09 +00:00
if not var then
return nil
end
2017-10-28 15:05:53 +00:00
assert ( var : match ( pat ) , conf_name .. " error: expected ` " .. varname .. " ' to match pattern ` " .. pat .. " ' " )
2014-07-05 00:48:09 +00:00
return var
end
function need_number ( varname , required )
2017-10-28 15:05:53 +00:00
local var , conf_name = loadvar ( varname )
2014-07-05 00:48:09 +00:00
if required == false and var == nil then
return nil
end
2017-10-28 15:05:53 +00:00
assert_type ( var , ' number ' , conf_name .. " error: expected ` " .. varname .. " ' to be a number " )
2014-07-05 00:48:09 +00:00
return var
end
2014-07-16 14:31:31 +00:00
function need_boolean ( varname , required )
2017-10-28 15:05:53 +00:00
local var , conf_name = loadvar ( varname )
2014-07-16 14:31:31 +00:00
if required == false and var == nil then
return nil
end
2017-10-28 15:05:53 +00:00
assert_type ( var , ' boolean ' , conf_name .. " error: expected ` " .. varname .. " ' to be a boolean " )
2014-07-16 14:31:31 +00:00
return var
end
2017-10-28 15:05:53 +00:00
local function __need_array_from_var ( var , varname , subcheck , required , conf_name )
2014-07-05 00:48:09 +00:00
if required == false and var == nil then
return nil
end
2017-10-28 15:05:53 +00:00
assert_type ( var , ' table ' , conf_name .. " error: expected ` " .. varname .. " ' to be an array " )
2014-07-05 00:48:09 +00:00
for _ , e in ipairs ( var ) do
subcheck ( e )
end
return var
end
2017-10-28 15:05:53 +00:00
function need_array ( varname , subcheck , required )
local var , conf_name = loadvar ( varname )
return __need_array_from_var ( var , varname , subcheck , required , conf_name )
end
2014-07-05 00:48:09 +00:00
function need_table ( varname , subcheck , required )
2017-10-28 15:05:53 +00:00
local var , conf_name = loadvar ( varname )
2014-07-05 00:48:09 +00:00
if required == false and var == nil then
return nil
end
2017-10-28 15:05:53 +00:00
assert_type ( var , ' table ' , conf_name .. " error: expected ` " .. varname .. " ' to be a table " )
local dvar = loadvar_domain ( varname )
local svar = loadvar_site ( varname )
2014-07-05 00:48:09 +00:00
2015-07-25 19:01:38 +00:00
if subcheck then
2017-10-28 15:05:53 +00:00
for k , _ in pairs ( keys_merged ( dvar , svar ) ) do
subcheck ( k , conf_name )
2015-07-25 19:01:38 +00:00
end
2014-07-05 00:48:09 +00:00
end
return var
end
2016-08-03 08:50:24 +00:00
function need_one_of ( varname , array , required )
2017-10-28 15:05:53 +00:00
local var , conf_name = loadvar ( varname )
2016-08-03 08:50:24 +00:00
if required == false and var == nil then
return nil
end
2017-10-28 15:05:53 +00:00
assert_one_of ( var , array , conf_name .. " error: expected ` " .. varname .. " ' to be one of given array: " .. array_to_string ( array ) )
2016-08-03 08:50:24 +00:00
return var
end
2014-07-05 00:48:09 +00:00
function need_string_array ( varname , required )
2017-10-28 15:05:53 +00:00
local var , conf_name = loadvar ( varname )
local ok , var = pcall ( __need_array_from_var , var , varname , function ( e ) assert_type ( e , ' string ' ) end , required , conf_name )
assert ( ok , conf_name .. " error: expected ` " .. varname .. " ' to be a string array " )
2016-08-26 16:53:02 +00:00
return var
2014-07-05 00:48:09 +00:00
end
2016-08-03 08:50:24 +00:00
2017-02-21 08:45:33 +00:00
function need_string_array_match ( varname , pat , required )
2017-10-28 15:05:53 +00:00
local var , conf_name = loadvar ( varname )
local ok , var = pcall ( __need_array_from_var , var , varname , function ( e ) assert ( e : match ( pat ) ) end , required , conf_name )
assert ( ok , conf_name .. " error: expected ` " .. varname .. " ' to be a string array matching pattern ` " .. pat .. " ' " )
2017-02-21 08:45:33 +00:00
return var
end
2016-08-03 08:50:24 +00:00
function need_array_of ( varname , array , required )
2017-10-28 15:05:53 +00:00
local var , conf_name = loadvar ( varname )
local ok , var = pcall ( __need_array_from_var , var , varname , function ( e ) assert_one_of ( e , array ) end , required , conf_name )
assert ( ok , conf_name .. " error: expected ` " .. varname .. " ' to be a subset of given array: " .. array_to_string ( array ) )
return var
end
function in_domain ( var )
forbid_in_site ( var )
return var
end
function in_site ( var )
forbid_in_domain ( var )
2016-08-03 08:50:24 +00:00
return var
end