local function loadvar(varname) local ok, val = pcall(assert(loadstring('return site.' .. varname))) if ok then return val else return nil end end local function assert_type(var, t, msg) assert(type(var) == t, msg) end function need_string(varname, required) local var = loadvar(varname) if required == false and var == nil then return nil end assert_type(var, 'string', "site.conf error: expected `" .. varname .. "' to be a string") return var end function need_string_match(varname, pat, required) local var = need_string(varname, required) if not var then return nil end assert(var:match(pat), "site.conf error: expected `" .. varname .. "' to match pattern `" .. pat .. "'") return var end function need_number(varname, required) local var = loadvar(varname) if required == false and var == nil then return nil end assert_type(var, 'number', "site.conf error: expected `" .. varname .. "' to be a number") return var end function need_boolean(varname, required) local var = loadvar(varname) if required == false and var == nil then return nil end assert_type(var, 'boolean', "site.conf error: expected `" .. varname .. "' to be a boolean") return var end function need_array(varname, subcheck, required) local var = loadvar(varname) if required == false and var == nil then return nil end assert_type(var, 'table', "site.conf error: expected `" .. varname .. "' to be an array") for _, e in ipairs(var) do subcheck(e) end return var end function need_table(varname, subcheck, required) local var = loadvar(varname) if required == false and var == nil then return nil end assert_type(var, 'table', "site.conf error: expected `" .. varname .. "' to be a table") for k, v in pairs(var) do subcheck(k, v) end return var end function need_string_array(varname, required) return assert(pcall(need_array, varname, function(e) assert_type(e, 'string') end, required), "site.conf error: expected `" .. varname .. "' to be a string array") end