Initial upload: API Mock CLI v0.1.0
Some checks failed
CI / test (3.11) (push) Has been cancelled
CI / test (3.12) (push) Has been cancelled
CI / test (3.9) (push) Has been cancelled
CI / lint (push) Has been cancelled
CI / type-check (push) Has been cancelled
CI / build (push) Has been cancelled
CI / test (3.10) (push) Has been cancelled
Some checks failed
CI / test (3.11) (push) Has been cancelled
CI / test (3.12) (push) Has been cancelled
CI / test (3.9) (push) Has been cancelled
CI / lint (push) Has been cancelled
CI / type-check (push) Has been cancelled
CI / build (push) Has been cancelled
CI / test (3.10) (push) Has been cancelled
This commit is contained in:
38
src/core/router.py
Normal file
38
src/core/router.py
Normal file
@@ -0,0 +1,38 @@
|
||||
import re
|
||||
from typing import Optional, Dict, Tuple, List, Any
|
||||
from src.models.endpoint import Endpoint
|
||||
|
||||
|
||||
class Router:
|
||||
def __init__(self):
|
||||
self.routes: List[Tuple[re.Pattern, Endpoint, Dict[str, str]]] = []
|
||||
self._compile_regex()
|
||||
|
||||
def _path_to_regex(self, path: str) -> Tuple[str, Dict[str, str]]:
|
||||
param_names = {}
|
||||
regex_path = re.sub(r"\{(\w+)\}", lambda m: param_names.__setitem__(m.group(1), m.group(0)) or "(?P<" + m.group(1) + ">[^/]+)", path)
|
||||
regex_path = f"^{regex_path}$"
|
||||
return regex_path, param_names
|
||||
|
||||
def _compile_regex(self):
|
||||
pass
|
||||
|
||||
def add_route(self, endpoint: Endpoint):
|
||||
pattern, param_names = self._path_to_regex(endpoint.path)
|
||||
compiled = re.compile(pattern)
|
||||
self.routes.append((compiled, endpoint, param_names))
|
||||
|
||||
def match(self, path: str, method: str) -> Optional[Tuple[Endpoint, Dict[str, str]]]:
|
||||
for compiled_pattern, endpoint, param_names in self.routes:
|
||||
if endpoint.method.upper() != method.upper():
|
||||
continue
|
||||
match = compiled_pattern.match(path)
|
||||
if match:
|
||||
return endpoint, match.groupdict()
|
||||
return None
|
||||
|
||||
def get_all_routes(self) -> List[Endpoint]:
|
||||
return [endpoint for _, endpoint, _ in self.routes]
|
||||
|
||||
def clear(self):
|
||||
self.routes.clear()
|
||||
Reference in New Issue
Block a user