o
    KK&h                     @   sf   d dl Z d dlmZmZ d dlmZ ddlmZmZ G dd de	Z
ddd	ZdddZdddZdS )    N)quoteunquote)InvalidUsage   )REGEX_PARAM_NAMEREGEX_PARAM_NAME_EXTc                   @   s   e Zd Zdd Zdd ZdS )	Immutablec                 G      t dNzCannot change immutable dict	TypeErrorselfargs r   F/var/www/html/venv/lib/python3.10/site-packages/sanic_routing/utils.py__setitem__      zImmutable.__setitem__c                 G   r	   r
   r   r   r   r   r   __delitem__   r   zImmutable.__delitem__N)__name__
__module____qualname__r   r   r   r   r   r   r   
   s    r   c                 C   s  i }|r}|  D ]t\}}| j| D ]M}|r|j|krS|js*|j}||||j<  n5|j|rM|j}d|jv rC|j|}|	d}||||j<  n|rSt
d|r^||j s^t
dq| jr|| j| D ]}t||j tr{t||j ||j< qgq|d u rt
d||fS )N(r   zInvalid parameter)itemsparamsraw_pathregexcastnamepatternsearchmatchgroup
ValueErrorr   
isinstancestr)routebasketr   r   idxvaluepgroupsr   r   r   parse_parameter_basket   s:   

r,   /c                 C   s8   t | |} t|}tdd t| d| D S )a  
    OK > /foo/<id:int>/bar/<name:[A-z]+>
    OK > /foo/<unhashable:[A-Za-z0-9/]+>
    OK > /foo/<ext:file\.(?P<ext>txt)>/<ext:[a-z]>
    OK > /foo/<user>/<user:str>
    OK > /foo/<ext:[a-z]>/<ext:file\.(?P<ext>txt)d>
    NOT OK > /foo/<ext:file\.(?P<ext>txt)d>/<ext:[a-z]>
    c                 s   s&    | ]}| d r|nt|V  qdS )<N)
startswithr   ).0partr   r   r   	<genexpr>?   s
    
z path_to_parts.<locals>.<genexpr>z(?=[^>]*(?:<(?<!\?<)|$)))r   lstripreescapetuplesplit)path	delimiterr   r   r   path_to_parts4   s
   	
r:   c           	      C   s  g }| D ]}| drz$t|}d}|dr d|d }|d|d | d W q ty   z8t|}d}d}|drMd|d }|drZd|d }d|d | d	| d}|| W n ty|   td
| w Y qw || q||S )Nr.       :r   >=   z:extzInvalid declaration: )	r/   r   r!   r"   appendAttributeErrorr   r   join)	partsr9   r8   r1   r!   
param_typefilename_typeextension_typesegmentr   r   r   parts_to_pathE   s<   


 



rI   )N)r-   )r4   urllib.parser   r   sanic_routing.exceptionsr   patternsr   r   dictr   r,   r:   rI   r   r   r   r   <module>   s    

"