mirror of
https://github.com/YunoHost/SSOwat.git
synced 2024-09-03 20:06:27 +02:00
67 lines
1.2 KiB
Lua
67 lines
1.2 KiB
Lua
|
local string_find, string_split, tostring, type =
|
||
|
string.find, string.split, tostring, type
|
||
|
|
||
|
local context = {}
|
||
|
context.__index = context
|
||
|
|
||
|
function context:clear_cache()
|
||
|
self.cache = {}
|
||
|
end
|
||
|
|
||
|
function context:push(view)
|
||
|
return self:new(view, self)
|
||
|
end
|
||
|
|
||
|
function context:lookup(name)
|
||
|
local value = self.cache[name]
|
||
|
|
||
|
if not value then
|
||
|
if name == "." then
|
||
|
value = self.view
|
||
|
else
|
||
|
local context = self
|
||
|
|
||
|
while context do
|
||
|
if string_find(name, ".") > 0 then
|
||
|
local names = string_split(name, ".")
|
||
|
local i = 0
|
||
|
|
||
|
value = context.view
|
||
|
|
||
|
if(type(value)) == "number" then
|
||
|
value = tostring(value)
|
||
|
end
|
||
|
|
||
|
while value and i < #names do
|
||
|
i = i + 1
|
||
|
value = value[names[i]]
|
||
|
end
|
||
|
else
|
||
|
value = context.view[name]
|
||
|
end
|
||
|
|
||
|
if value then
|
||
|
break
|
||
|
end
|
||
|
|
||
|
context = context.parent
|
||
|
end
|
||
|
end
|
||
|
|
||
|
self.cache[name] = value
|
||
|
end
|
||
|
|
||
|
return value
|
||
|
end
|
||
|
|
||
|
function context:new(view, parent)
|
||
|
local out = {
|
||
|
view = view,
|
||
|
parent = parent,
|
||
|
cache = {},
|
||
|
}
|
||
|
return setmetatable(out, context)
|
||
|
end
|
||
|
|
||
|
return context
|