Created
June 12, 2013 20:57
-
-
Save solso/5769046 to your computer and use it in GitHub Desktop.
router in lua
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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