summaryrefslogtreecommitdiff
path: root/misc/freeswitch/scripts/common/array.lua
diff options
context:
space:
mode:
Diffstat (limited to 'misc/freeswitch/scripts/common/array.lua')
-rw-r--r--misc/freeswitch/scripts/common/array.lua54
1 files changed, 54 insertions, 0 deletions
diff --git a/misc/freeswitch/scripts/common/array.lua b/misc/freeswitch/scripts/common/array.lua
new file mode 100644
index 0000000..b93ef69
--- /dev/null
+++ b/misc/freeswitch/scripts/common/array.lua
@@ -0,0 +1,54 @@
+-- Gemeinschaft 5 module: array functions
+-- (c) AMOOMA GmbH 2013
+--
+
+module(...,package.seeall)
+
+function try(array, arguments)
+ if type(arguments) ~= 'string' or type(array) ~= 'table' then
+ return nil;
+ end
+
+ local result = array;
+
+ arguments:gsub('([^%.]+)', function(entry)
+ local success, result = pcall(function() result = (result[tonumber(entry) or entry]); end);
+ end);
+
+ return result;
+end
+
+
+function set(array, arguments, value)
+ local nop, arguments_count = arguments:gsub('%.', '');
+ local structure = array;
+ arguments:gsub('([^%.]+)', function(entry)
+ if arguments_count <= 0 then
+ structure[entry] = value;
+ elseif type(structure[entry]) == 'table' then
+ structure = structure[entry];
+ else
+ structure[entry] = {};
+ structure = structure[entry];
+ end
+ arguments_count = arguments_count - 1;
+ end);
+end
+
+
+function expand_variable(variable_path, variable_sets)
+ for index=1, #variable_sets do
+ local result = try(variable_sets[index], variable_path);
+ if result then
+ return result;
+ end
+ end
+end
+
+
+function expand_variables(line, ...)
+ local variable_sets = {...};
+ return (line:gsub('{([%a%d%._]+)}', function(captured)
+ return expand_variable(captured, variable_sets);
+ end))
+end