62 lines
1.9 KiB
Python
62 lines
1.9 KiB
Python
#!/usr/bin/env python3
|
|
# -*- coding: utf-8 -*-
|
|
|
|
from typing import Self, Any
|
|
from Utils.Check import Check
|
|
from Utils.Utils import Utils
|
|
from Utils.Patterns import RE
|
|
from re import Match as REMatch
|
|
from re import Pattern as REPattern
|
|
from re import compile as re_compile
|
|
|
|
class RouteModel:
|
|
|
|
def __init__(self:Self, inputs:str|list|tuple) -> None:
|
|
|
|
self.method:str
|
|
self.request:REPattern
|
|
self.controller:str
|
|
self.action:str
|
|
self.path:str|None
|
|
self.variables:tuple[str] = tuple()
|
|
self.permissions:list[str] = []
|
|
self.done:bool = False
|
|
|
|
if Check.is_string(inputs):
|
|
inputs = RE.ROUTE_ITEM.match(inputs).groups()
|
|
|
|
if Check.is_array(inputs):
|
|
|
|
self.done = True
|
|
(
|
|
self.method, self.request, self.action, self.controller, self.path, self.permissions
|
|
) = (lambda method, request, controller, action, path, permissions:(
|
|
method.lower(),
|
|
re_compile(r'^' + RE.ROUTE_RE_FORMAT.sub(
|
|
self.format_request_item,
|
|
RE.STRING_VARIABLES.sub(self.__add_variable, request)
|
|
) + (r'' if path else ('' if request[-1] == '/' else r'\/') + r'?$')),
|
|
controller,
|
|
action,
|
|
path,
|
|
(
|
|
[] if not permissions else
|
|
str(permissions).split(",") if Check.is_string(permissions) else
|
|
list(permissions) if Check.is_array(permissions) else
|
|
[])
|
|
))(*inputs)
|
|
|
|
def __add_variable(self:Self, key:str) -> str:
|
|
|
|
self.variables += (key,)
|
|
|
|
return r'([^\/]+)'
|
|
|
|
@staticmethod
|
|
def format_request_item(matches:REMatch) -> str:
|
|
|
|
character:str = matches.group(2)
|
|
|
|
return '\\' + character if character else matches.group(1)
|
|
|