Skip to content

Instantly share code, notes, and snippets.

@solso
Created June 12, 2013 20:57
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save solso/5769046 to your computer and use it in GitHub Desktop.
Save solso/5769046 to your computer and use it in GitHub Desktop.
router in lua
inspect = require "inspect"
MYROUTES = {
services = {
list = {
leaf = true,
callback = function(params) for k, v in pairs(params) do print("key: " .. k .. " value: " .. v) end end
},
_WILD = {
list = {
_prev_param_name = "_service_id",
leaf = true,
callback = function(params) for k, v in pairs(params) do print("key: " .. k .. " value: " .. v) end end
},
bar = {
_prev_param_name = "_bar_service_id",
foo = {
_WILD = {
_param_name = "_foo_id",
leaf = true,
callback = function(params) for k, v in pairs(params) do print("key: " .. k .. " value: " .. v) end end
}
}
}
}
},
stats = {
leaf = true,
callback = function(params) for k, v in pairs(params) do print("key: " .. k .. " value: " .. v) end end
}
}
function split(str, delimiter)
local result = { }
local from = 1
local delim_from, delim_to = string.find( str, delimiter, from )
while delim_from do
table.insert( result, string.sub( str, from , delim_from-1 ) )
from = delim_to + 1
delim_from, delim_to = string.find( str, delimiter, from )
end
table.insert( result, string.sub( str, from ) )
return result
end
function router(routes, path)
local params = {}
local tokens = split(path,"/")
-- first / needs to go
table.remove(tokens,1)
local t = routes
for i, token in ipairs(tokens) do
if t==nil then
return 404
end
if t[token]==nil and t["_WILD"]==nil then
return 404
end
if t[token]==nil then
t = t["_WILD"]
if t["_param_name"]==nil then
tmp = token
else
params[t["_param_name"]] = token
end
if t["leaf"] then
if i==#tokens then
t["callback"](params)
return 200
else
return 404
end
end
else
t = t[token]
if t["_prev_param_name"]~=nil and tmp~=nil then
params[t["_prev_param_name"]] = tmp
tmp = nil
end
if t["leaf"]==true then
if i==#tokens then
t["callback"](params)
return 200
else
return 404
end
end
end
end
return 404
end
-- /stats
-- /services/list
-- /services/:service_id/list
-- /services/:bar_service_id/bar/foo/:foo_id
print(inspect(MYROUTES))
print("tests..............")
print(router(MYROUTES,"/kkk")==404)
print(router(MYROUTES,"/stats")==200)
print(router(MYROUTES,"/stats2")==404)
print(router(MYROUTES,"/services")==404)
print(router(MYROUTES,"/services/list")==200)
print(router(MYROUTES,"/services/42/list")==200)
print(router(MYROUTES,"/services/42/bar")==404)
print(router(MYROUTES,"/services/42/bar/foo")==404)
print(router(MYROUTES,"/services/42/bar/xxx")==404)
print(router(MYROUTES,"/services/42/bar/foo/66")==200)
print(router(MYROUTES,"/services/42/bar/foo/66/bla")==404)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment