import re from day9.task5_vue.utils import NOT_FOUND_CODE, BAD_REQUEST_CODE from day9.task5_vue.core import Response, ErrorResponse def route(url_format, methods=None): if methods is None: methods = ['GET'] def wrapper(func): def inner(url, query, *args, **kwargs): pattern = re.compile(url_format) match = re.fullmatch(pattern, url) if match is None or len(match.groups()) != pattern.groups: return ErrorResponse(BAD_REQUEST_CODE) return func(query, *match.groups(), *args, **kwargs) _router_tree[url_format] = _router_tree.get(url_format, {}) for method in methods: _router_tree[url_format][method] = inner return inner return wrapper def run(request) -> Response: res = ErrorResponse(NOT_FOUND_CODE) method, url = request['method'], request['url'] for url_pattern in _router_tree: if re.fullmatch(url_pattern, url) and method in _router_tree[url_pattern]: res = _router_tree[url_pattern][method](url, request['query']) break return res _router_tree = {}