check_site_lib.lua 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  1. function in_site(var)
  2. return var
  3. end
  4. function in_domain(var)
  5. return var
  6. end
  7. local function loadvar(varname)
  8. local ok, val = pcall(assert(loadstring('return site.' .. varname)))
  9. if ok then
  10. return val
  11. else
  12. return nil
  13. end
  14. end
  15. local function array_to_string(array)
  16. local string = ''
  17. for _, v in ipairs(array) do
  18. if #string >= 1 then
  19. string = string .. ', '
  20. end
  21. string = string .. v
  22. end
  23. return '[' .. string .. ']'
  24. end
  25. local function assert_one_of(var, array, msg)
  26. for _, v in ipairs(array) do
  27. if v == var then
  28. return true
  29. end
  30. end
  31. error(msg)
  32. end
  33. local function assert_type(var, t, msg)
  34. assert(type(var) == t, msg)
  35. end
  36. function assert_uci_name(var)
  37. -- We don't use character classes like %w here to be independent of the locale
  38. assert(var:match('^[0-9a-zA-Z_]+$'), "site.conf error: `" .. var .. "' is not a valid config section name (only alphanumeric characters and the underscore are allowed)")
  39. end
  40. function need_string(varname, required)
  41. local var = loadvar(varname)
  42. if required == false and var == nil then
  43. return nil
  44. end
  45. assert_type(var, 'string', "site.conf error: expected `" .. varname .. "' to be a string")
  46. return var
  47. end
  48. function need_string_match(varname, pat, required)
  49. local var = need_string(varname, required)
  50. if not var then
  51. return nil
  52. end
  53. assert(var:match(pat), "site.conf error: expected `" .. varname .. "' to match pattern `" .. pat .. "'")
  54. return var
  55. end
  56. function need_number(varname, required)
  57. local var = loadvar(varname)
  58. if required == false and var == nil then
  59. return nil
  60. end
  61. assert_type(var, 'number', "site.conf error: expected `" .. varname .. "' to be a number")
  62. return var
  63. end
  64. function need_boolean(varname, required)
  65. local var = loadvar(varname)
  66. if required == false and var == nil then
  67. return nil
  68. end
  69. assert_type(var, 'boolean', "site.conf error: expected `" .. varname .. "' to be a boolean")
  70. return var
  71. end
  72. function need_array(varname, subcheck, required)
  73. local var = loadvar(varname)
  74. if required == false and var == nil then
  75. return nil
  76. end
  77. assert_type(var, 'table', "site.conf error: expected `" .. varname .. "' to be an array")
  78. for _, e in ipairs(var) do
  79. subcheck(e)
  80. end
  81. return var
  82. end
  83. function need_table(varname, subcheck, required)
  84. local var = loadvar(varname)
  85. if required == false and var == nil then
  86. return nil
  87. end
  88. assert_type(var, 'table', "site.conf error: expected `" .. varname .. "' to be a table")
  89. if subcheck then
  90. for k, v in pairs(var) do
  91. subcheck(k, v)
  92. end
  93. end
  94. return var
  95. end
  96. function need_one_of(varname, array, required)
  97. local var = loadvar(varname)
  98. if required == false and var == nil then
  99. return nil
  100. end
  101. assert_one_of(var, array, "site.conf error: expected `" .. varname .. "' to be one of given array: " .. array_to_string(array))
  102. return var
  103. end
  104. function need_string_array(varname, required)
  105. local ok, var = pcall(need_array, varname, function(e) assert_type(e, 'string') end, required)
  106. assert(ok, "site.conf error: expected `" .. varname .. "' to be a string array")
  107. return var
  108. end
  109. function need_string_array_match(varname, pat, required)
  110. local ok, var = pcall(need_array, varname, function(e) assert(e:match(pat)) end, required)
  111. assert(ok, "site.conf error: expected `" .. varname .. "' to be a string array matching pattern `" .. pat .. "'")
  112. return var
  113. end
  114. function need_array_of(varname, array, required)
  115. local ok, var = pcall(need_array, varname, function(e) assert_one_of(e, array) end,required)
  116. assert(ok, "site.conf error: expected `" .. varname .. "' to be a subset of given array: " .. array_to_string(array))
  117. return var
  118. end