diff options
-rw-r--r-- | acf/model/init.lua | 29 | ||||
-rw-r--r-- | acf/modules/awall.lua | 15 |
2 files changed, 29 insertions, 15 deletions
diff --git a/acf/model/init.lua b/acf/model/init.lua index 202c0e0..f333886 100644 --- a/acf/model/init.lua +++ b/acf/model/init.lua @@ -10,7 +10,7 @@ local Field = fld.Field local model = require('acf.model.model') new = model.new -to_field = model.to_field +local to_field = model.to_field node = require('acf.model.node') @@ -22,6 +22,9 @@ local pth = require('acf.path') local map = require('acf.util').map +require 'stringy' + + -- TODO object-specific actions -- TODO access control @@ -43,6 +46,7 @@ function String:init(params) end function String:validate(txn, path, value) + super(self, String):validate(txn, path, value) if self['max-length'] and string.len(value) > self['max-length'] then error('Maximum length exceeded: '..value) end @@ -63,13 +67,18 @@ function Number:init(params) end function Number:_validate(txn, path, value) - return tonumber(super(self, Number):_validate(txn, path, value)) + return super(self, Number):_validate( + txn, + path, + value and tonumber(value) or value + ) end Integer = class(Number) function Integer:validate(txn, path, value) + super(self, Integer):validate(txn, path, value) if math.floor(value) ~= value then error('Not an integer: '..value) end end @@ -83,6 +92,22 @@ function Boolean:init(params) end +Range = class(String) + +function Range:init(params) + super(self, Range):init(params) + if not self.type then self.type = Integer end +end + +function Range:validate(txn, path, value) + local comps = stringy.split(value, '-') + if #comps > 2 then error('Invalid range') end + for _, v in ipairs(comps) do + to_field(self.type):_validate(txn, path, v) + end +end + + Reference = class(Field) function Reference:init(params) diff --git a/acf/modules/awall.lua b/acf/modules/awall.lua index 7d147f4..0b73f9c 100644 --- a/acf/modules/awall.lua +++ b/acf/modules/awall.lua @@ -31,18 +31,7 @@ function Port:validate(txn, path, value) if value < 0 or value > 65535 then error('Invalid port: '..value) end end -Range = class(M.String) -function Range:validate(txn, path, value) - local comps = stringy.split(value, '-') - if #comps > 2 then error('Invalid range: '..value) end - for _, v in ipairs(comps) do - local num = tonumber(v) - if not num then error('Invalid range: ' ..value) end - M.to_field(self.type):validate(txn, path, num) - end -end - -PortRange = class(Range) +PortRange = class(M.Range) function PortRange:init() super(self, PortRange):init{type=Port} end Direction = class(M.String) @@ -108,7 +97,7 @@ FilterRule.dnat = IPv4Addr FilterRule['no-track'] = M.Boolean{default=false} NATRule = M.new(Rule) -NATRule['to-addr'] = Range{type=IPv4Addr} +NATRule['to-addr'] = M.Range{type=IPv4Addr} NATRule['to-port'] = PortRange MarkRule = M.new(Rule) |