diff options
Diffstat (limited to 'src/ffluci/cbi.lua')
-rw-r--r-- | src/ffluci/cbi.lua | 127 |
1 files changed, 123 insertions, 4 deletions
diff --git a/src/ffluci/cbi.lua b/src/ffluci/cbi.lua index de02699de..fc8b1aed3 100644 --- a/src/ffluci/cbi.lua +++ b/src/ffluci/cbi.lua @@ -25,8 +25,10 @@ limitations under the License. ]]-- module("ffluci.cbi", package.seeall) +require("ffluci.template") require("ffluci.util") local class = ffluci.util.class +local instanceof = ffluci.util.instanceof -- Node pseudo abstract class @@ -36,6 +38,7 @@ function Node.__init__(self, title, description) self.children = {} self.title = title self.description = description + self.template = "cbi/node" end function Node.append(self, obj) @@ -43,13 +46,129 @@ function Node.append(self, obj) end --- CBI Map +--[[ +Map - A map describing a configuration file +]]-- Map = class(Node) -function Map.__init__(self, ...) +function Map.__init__(self, config, ...) + Node.__init__(self, ...) + self.config = config + self.template = "cbi/map" +end + +function Map.render(self) + ffluci.template.render(self.template) +end + +function Map.section(self, class, ...) + if instanceof(class, AbstractClass) then + local obj = class(...) + obj.map = self + table.insert(self.children, obj) + return obj + else + error("class must be a descendent of AbstractSection") + end +end + + +--[[ +AbstractSection +]]-- +AbstractSection = class(Node) + +function AbstractSection.__init__(self, ...) + Node.__init__(self, ...) +end + +function AbstractSection.option(self, class, ...) + if instanceof(class, AbstractValue) then + local obj = class(...) + obj.section = self + obj.map = self.map + table.insert(self.children, obj) + return obj + else + error("class must be a descendent of AbstractValue") + end +end + + + +--[[ +NamedSection - A fixed configuration section defined by its name +]]-- +NamedSection = class(AbstractSection) + +function NamedSection.__init__(self, section, ...) + AbstractSection.__init__(self, ...) + self.section = section + self.template = "cbi/nsection" +end + + +--[[ +TypedSection - A (set of) configuration section(s) defined by the type + addremove: Defines whether the user can add/remove sections of this type + anonymous: Allow creating anonymous sections + valid: a table with valid names or a function returning nil if invalid +]]-- +TypedSection = class(AbstractSection) + +function TypedSection.__init__(self, sectiontype, ...) + AbstractSection.__init__(self, ...) + self.sectiontype = sectiontype + self.template = "cbi/tsection" + + self.addremove = true + self.anonymous = false + self.valid = nil +end + + +--[[ +AbstractValue - An abstract Value Type + null: Value can be empty + valid: A table with valid names or a function returning nil if invalid + depends: A table of option => value pairs of which one must be true +]]-- +AbstractValue = class(Node) + +function AbstractValue.__init__(self, option, ...) Node.__init__(self, ...) + self.option = option + + self.null = true + self.valid = nil + self.depends = nil end + + +--[[ +Value - A one-line value + maxlength: The maximum length + isnumber: The value must be a valid (floating point) number + isinteger: The value must be a valid integer +]]-- +Value = class(AbstractValue) -function Map.render(self, template) - -- ToDo +function Value.__init__(self, ...) + AbstractValue.__init__(self, ...) + self.template = "cbi/value" + + self.maxlength = nil + self.isnumber = false + self.isinteger = false end + + +--[[ +Boolean - A simple boolean value +]]-- +Boolean = class(AbstractValue) + +function Boolean.__init__(self, ...) + AbstractValue.__init__(self, ...) + self.template = "cbi/boolean" +end
\ No newline at end of file |