* CBI: updates
[project/luci.git] / src / ffluci / util.lua
index 07cbb8000cea6835b702be39fb399ffbe411656b..38f33a20d46f224cddf049d7ffab548c1d8bfb9e 100644 (file)
@@ -26,6 +26,36 @@ limitations under the License.
 
 module("ffluci.util", package.seeall)
 
+
+-- Lua simplified Python-style OO class support emulation
+function class(base)
+       local class = {}
+       
+       local create = function(class, ...)
+               local inst = {}
+               setmetatable(inst, {__index = class})
+               
+               if inst.__init__ then
+                       local stat, err = pcall(inst.__init__, inst, ...)
+                       if not stat then
+                               error(err)
+                       end
+               end
+               
+               return inst
+       end
+       
+       local classmeta = {__call = create}
+       
+       if base then
+               classmeta.__index = base
+       end
+       
+       setmetatable(class, classmeta)
+       return class
+end
+
+
 -- Checks whether a table has an object "value" in it
 function contains(table, value)
        for k,v in pairs(table) do
@@ -57,45 +87,97 @@ end
 
 
 -- Runs "command" and returns its output
-function exec(command, return_array)
+function exec(command)
        local pp   = io.popen(command)
-       local data = nil
+       local data = pp:read("*a")
+       pp:close()
        
-       if return_array then
-               local line = ""
-               data = {}
-               
-               while true do
-                       line = pp:read()
-                       if (line == nil) then break end
-                       table.insert(data, line)
-               end 
-               pp:close()              
-       else
-               data = pp:read("*a")
-               pp:close()
-       end
+       return data
+end
+
+
+-- Runs "command" and returns its output as a array of lines
+function execl(command)
+       local pp   = io.popen(command)  
+       local line = ""
+       local data = {}
+       
+       while true do
+               line = pp:read()
+               if (line == nil) then break end
+               table.insert(data, line)
+       end 
+       pp:close()      
        
        return data
 end
 
+
 -- Populate obj in the scope of f as key 
 function extfenv(f, key, obj)
        local scope = getfenv(f)
        scope[key] = obj
-       setfenv(f, scope)
 end
 
 
+-- Checks whether an object is an instanceof class
+function instanceof(object, class)
+       local meta = getmetatable(object)
+    while meta and meta.__index do 
+       if meta.__index == class then
+               return true
+       end
+        meta = getmetatable(meta.__index)
+    end
+    return false       
+end
+
+
+-- Resets the scope of f doing a shallow copy of its scope into a new table
+function resfenv(f)
+       local scope = getfenv(f)
+       setfenv(f, {})
+       updfenv(f, scope)
+end 
+
+
+-- Returns the Haserl unique sessionid
+function sessionid()
+       return ENV.SESSIONID
+end
+
 -- Updates the scope of f with "extscope"
 function updfenv(f, extscope)
        local scope = getfenv(f)
        for k, v in pairs(extscope) do
                scope[k] = v
        end
-       setfenv(f, scope)
 end
 
+
+-- Validates a variable
+function validate(value, cast_number, cast_int, valid)
+       if cast_number or cast_int then
+               value = tonumber(value)
+       end
+       
+       if cast_int and not(value % 1 == 0) then
+               value = nil
+       end
+       
+       
+       if type(valid) == "function" then
+               value = valid(value)
+       elseif type(valid) == "table" then
+               if not contains(valid, value) then
+                       value = nil
+               end
+       end
+       
+       return value
+end
+
+
 -- Returns the filename of the calling script
 function __file__()
        return debug.getinfo(2, 'S').source:sub(2)