libs/web: dispatcher: implement a "firstchild()" target which simply redirects to...
authorJo-Philipp Wich <jow@openwrt.org>
Tue, 25 Oct 2011 22:48:43 +0000 (22:48 +0000)
committerJo-Philipp Wich <jow@openwrt.org>
Tue, 25 Oct 2011 22:48:43 +0000 (22:48 +0000)
libs/web/luasrc/dispatcher.lua

index 9bfa413cf8ba53b9958fc2e4293fcf46421b4bab..5f893dad95f9d698ab79f105e5cf464d2cc1a893 100644 (file)
@@ -638,6 +638,35 @@ end
 
 -- Subdispatchers --
 
+function _firstchild()
+   local path = { unpack(context.path) }
+   local name = table.concat(path, ".")
+   local node = context.treecache[name]
+
+   local lowest
+   if node and node.nodes and next(node.nodes) then
+         local k, v
+         for k, v in pairs(node.nodes) do
+                if not lowest or
+                       (v.order or 100) < (node.nodes[lowest].order or 100)
+                then
+                       lowest = k
+                end
+         end
+   end
+
+   assert(lowest ~= nil,
+                 "The requested node contains no childs, unable to redispatch")
+
+   path[#path+1] = lowest
+   dispatch(path)
+end
+
+--- Alias the first (lowest order) page automatically
+function firstchild()
+   return { type = "firstchild", target = _firstchild }
+end
+
 --- Create a redirect to another dispatching node.
 -- @param      ...             Virtual path destination
 function alias(...)