datatypes.lua 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. -- Copyright 2010 Jo-Philipp Wich <jow@openwrt.org>
  2. -- Copyright 2017 Matthias Schiffer <mschiffer@universe-factory.net>
  3. -- Licensed to the public under the Apache License 2.0.
  4. local tonumber = tonumber
  5. module "gluon.web.model.datatypes"
  6. function bool(val)
  7. if val == "1" or val == "yes" or val == "on" or val == "true" then
  8. return true
  9. elseif val == "0" or val == "no" or val == "off" or val == "false" then
  10. return true
  11. elseif val == "" or val == nil then
  12. return true
  13. end
  14. return false
  15. end
  16. local function dec(val)
  17. if val:match('^%-?%d*%.?%d+$') then
  18. return tonumber(val)
  19. end
  20. end
  21. local function int(val)
  22. if val:match('^%-?%d+$') then
  23. return tonumber(val)
  24. end
  25. end
  26. function uinteger(val)
  27. local n = int(val)
  28. return (n ~= nil and n >= 0)
  29. end
  30. function integer(val)
  31. return (int(val) ~= nil)
  32. end
  33. function ufloat(val)
  34. local n = dec(val)
  35. return (n ~= nil and n >= 0)
  36. end
  37. function float(val)
  38. return (dec(val) ~= nil)
  39. end
  40. function ipaddr(val)
  41. return ip4addr(val) or ip6addr(val)
  42. end
  43. function ip4addr(val)
  44. local g = '(%d%d?%d?)'
  45. local v1, v2, v3, v4 = val:match('^'..((g..'%.'):rep(3))..g..'$')
  46. local n1, n2, n3, n4 = tonumber(v1), tonumber(v2), tonumber(v3), tonumber(v4)
  47. if not (n1 and n2 and n3 and n4) then return false end
  48. return (
  49. (n1 >= 0) and (n1 <= 255) and
  50. (n2 >= 0) and (n2 <= 255) and
  51. (n3 >= 0) and (n3 <= 255) and
  52. (n4 >= 0) and (n4 <= 255)
  53. )
  54. end
  55. function ip6addr(val)
  56. local g1 = '%x%x?%x?%x?'
  57. if not val:match('::') then
  58. return val:match('^'..((g1..':'):rep(7))..g1..'$') ~= nil
  59. end
  60. if
  61. val:match(':::') or val:match('::.+::') or
  62. val:match('^:[^:]') or val:match('[^:]:$')
  63. then
  64. return false
  65. end
  66. local g0 = '%x?%x?%x?%x?'
  67. for i = 2, 7 do
  68. if val:match('^'..((g0..':'):rep(i))..g0..'$') then
  69. return true
  70. end
  71. end
  72. if val:match('^'..((g1..':'):rep(7))..':$') then
  73. return true
  74. end
  75. if val:match('^:'..((':'..g1):rep(7))..'$') then
  76. return true
  77. end
  78. return false
  79. end
  80. function wpakey(val)
  81. if #val == 64 then
  82. return (val:match("^%x+$") ~= nil)
  83. else
  84. return (#val >= 8) and (#val <= 63)
  85. end
  86. end
  87. function range(val, vmin, vmax)
  88. return min(val, vmin) and max(val, vmax)
  89. end
  90. function min(val, min)
  91. val = dec(val)
  92. min = tonumber(min)
  93. if val ~= nil and min ~= nil then
  94. return (val >= min)
  95. end
  96. return false
  97. end
  98. function max(val, max)
  99. val = dec(val)
  100. max = tonumber(max)
  101. if val ~= nil and max ~= nil then
  102. return (val <= max)
  103. end
  104. return false
  105. end
  106. function irange(val, vmin, vmax)
  107. return integer(val) and range(val, vmin, vmax)
  108. end
  109. function imin(val, vmin)
  110. return integer(val) and min(val, vmin)
  111. end
  112. function imax(val, vmax)
  113. return integer(val) and max(val, vmax)
  114. end
  115. function minlength(val, min)
  116. min = tonumber(min)
  117. if min ~= nil then
  118. return (#val >= min)
  119. end
  120. return false
  121. end
  122. function maxlength(val, max)
  123. max = tonumber(max)
  124. if max ~= nil then
  125. return (#val <= max)
  126. end
  127. return false
  128. end