import re
class Route(object):
def __init__(self, pattern=[]):
self.pattern = [pattern] if isinstance(pattern,str) else pattern
@staticmethod
def make(source):
if isinstance(source,str):
return Route([source])
else:
result = Route()
for i in source:
if isinstance(i,str):
result.pattern.append(i)
else:
result.pattern = Route.make(i).pattern
return result
def match(self, src):
for i in self.pattern:
if re.match("^%s$"%i,src) is not None:
return True
return False
class Router(object):
def __init__(self):
self.routes = []
def __call__(self, *args, **kwargs):
def handler(callback):
if args is not None:
make = kwargs["make"] if "make" in kwargs else Route.make
methods = kwargs["methods"] if "methods" in kwargs else ["GET"]
self.routes.append((list(map(make,args)),callback,methods))
return callback
return handler
aW1wb3J0IHJlCgpjbGFzcyBSb3V0ZShvYmplY3QpOgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHBhdHRlcm49W10pOgogICAgICAgIHNlbGYucGF0dGVybiA9IFtwYXR0ZXJuXSBpZiBpc2luc3RhbmNlKHBhdHRlcm4sc3RyKSBlbHNlIHBhdHRlcm4KICAgIAogICAgQHN0YXRpY21ldGhvZAogICAgZGVmIG1ha2Uoc291cmNlKToKICAgICAgICBpZiBpc2luc3RhbmNlKHNvdXJjZSxzdHIpOgogICAgICAgICAgICByZXR1cm4gUm91dGUoW3NvdXJjZV0pCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmVzdWx0ID0gUm91dGUoKQogICAgICAgICAgICBmb3IgaSBpbiBzb3VyY2U6CiAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGksc3RyKToKICAgICAgICAgICAgICAgICAgICByZXN1bHQucGF0dGVybi5hcHBlbmQoaSkKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnBhdHRlcm4gPSBSb3V0ZS5tYWtlKGkpLnBhdHRlcm4KICAgICAgICAgICAgcmV0dXJuIHJlc3VsdAogICAgCiAgICBkZWYgbWF0Y2goc2VsZiwgc3JjKToKICAgICAgICBmb3IgaSBpbiBzZWxmLnBhdHRlcm46CiAgICAgICAgICAgIGlmIHJlLm1hdGNoKCJeJXMkIiVpLHNyYykgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQogICAgICAgIHJldHVybiBGYWxzZQoKY2xhc3MgUm91dGVyKG9iamVjdCk6CiAgICBkZWYgX19pbml0X18oc2VsZik6CiAgICAgICAgc2VsZi5yb3V0ZXMgPSBbXQogICAgICAgIAogICAgZGVmIF9fY2FsbF9fKHNlbGYsICphcmdzLCAqKmt3YXJncyk6CiAgICAgICAgZGVmIGhhbmRsZXIoY2FsbGJhY2spOgogICAgICAgICAgICBpZiBhcmdzIGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgbWFrZSA9IGt3YXJnc1sibWFrZSJdIGlmICJtYWtlIiBpbiBrd2FyZ3MgZWxzZSBSb3V0ZS5tYWtlCiAgICAgICAgICAgICAgICBtZXRob2RzID0ga3dhcmdzWyJtZXRob2RzIl0gaWYgIm1ldGhvZHMiIGluIGt3YXJncyBlbHNlIFsiR0VUIl0KICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgc2VsZi5yb3V0ZXMuYXBwZW5kKChsaXN0KG1hcChtYWtlLGFyZ3MpKSxjYWxsYmFjayxtZXRob2RzKSkKICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrCiAgICAgICAgcmV0dXJuIGhhbmRsZXI=