o
    >h5                  	   @   s   d dl Z d dlmZmZ d dlmZ d dlmZmZ dZ	de
fddZeG d	d
 d
eZeddee
 dee dee fddZeddee
 dee dee fddZede
fddZdS )    N)OptionalUnion)public)RegisterOptionsSubscribeOptions)Patternregister	subscribeerrorconvert_starred_uriuric                 C   sr   t | tksJ | d}|dkrd}| |fS |dkr-| d dkr-d}| dd } | |fS d}| dd	} | |fS )
a  
    Convert a starred URI to a standard WAMP URI and a detected matching
    policy. A starred URI is one that may contain the character '*' used
    to mark URI wildcard components or URI prefixes. Starred URIs are
    more comfortable / intuitive to use at the user/API level, but need
    to be converted for use on the wire (WAMP protocol level).

    This function takes a possibly starred URI, detects the matching policy
    implied by stars, and returns a pair (uri, match) with any stars
    removed from the URI and the detected matching policy.

    An URI like 'com.example.topic1' (without any stars in it) is
    detected as an exact-matching URI.

    An URI like 'com.example.*' (with exactly one star at the very end)
    is detected as a prefix-matching URI on 'com.example.'.

    An URI like 'com.*.foobar.*' (with more than one star anywhere) is
    detected as a wildcard-matching URI on 'com..foobar.' (in this example,
    there are two wildcard URI components).

    Note that an URI like 'com.example.*' is always detected as
    a prefix-matching URI 'com.example.'. You cannot express a wildcard-matching
    URI 'com.example.' using the starred URI notation! A wildcard matching on
    'com.example.' is different from prefix-matching on 'com.example.' (which
    matches a strict superset of the former!). This is one reason we don't use
    starred URIs for WAMP at the protocol level.
    *r   exact   prefixNwildcard )typestrcountreplace)r   	cnt_starsmatch r   q/var/www/vedio/testing/chatpythonscript.ninositsolution.com/env/lib/python3.10/site-packages/autobahn/wamp/uri.pyr   +   s   

r   c                
   @   s   e Zd ZdZdZdZdZdZdZdZ	e
dZ	 e
dZ	 e
dZ	 		dd	ed
edeeeef  dee fddZeedd Zeedd Zedd Zdd Zedd Zedd Zedd ZdS )r   z
    A WAMP URI Pattern.

    .. todo::

       * suffix matches
       * args + kwargs
       * uuid converter
       * multiple URI patterns per decorated object
       * classes: Pattern, EndpointPattern, ..
    r         z^[a-z0-9][a-z0-9_\-]*$z^<([a-z][a-z0-9_]*)>$z^<([a-z][a-z0-9_]*):([a-z]*)>$Nr   targetoptionscheck_typesc                 C   s\  t |tksJ t|dksJ |tjtjtjfv sJ |tjkr.|du s-t |tks-J n|tjkr@|du s?t |tks?J nd}|	d}d}g }i }d}	t
t|D ]}
||
 }tj|}|r| \}}|dvrqtd|dkr|
t|d krtd||v rtd|d	v rt||< n|d
krt||< ntd|d|| |	d7 }	qUtj|}|r| d }||v rtdt||< |d|| |	d7 }	qUtj|}|r|| qU|dkr|	d7 }	|d| t||	< qUtd|rtj| _dd| d }t|| _|| _n
tj| _d| _d| _|| _|| _|| _|| _dS )a  

        :param uri: The URI or URI pattern, e.g. ``"com.myapp.product.<product:int>.update"``.
        :type uri: str

        :param target: The target for this pattern: a procedure endpoint (a callable),
           an event handler (a callable) or an exception (a class).
        :type target: callable or obj

        :param options: An optional options object
        :type options: None or RegisterOptions or SubscribeOptions

        :param check_types: Enable automatic type checking against (Python 3.5+) type hints
            specified on the ``endpoint`` callable. Types are checked at run-time on each
            invocation of the ``endpoint`` callable. When a type mismatch occurs, the error
            is forwarded to the callee code in ``onUserError`` override method of
            :class:`autobahn.wamp.protocol.ApplicationSession`. An error
            of type :class:`autobahn.wamp.exception.TypeCheckError` is also raised and
            returned to the caller (via the router).
        :type check_types: bool

        r   N.z	[^\s\.#]+)r   stringintsuffixzinvalid URIr$   r   )r   r"   r$   r#   zlogic errorz
(?P<{}>{})r   z({})^z\.$) r   r   lenr   URI_TARGET_ENDPOINTURI_TARGET_HANDLERURI_TARGET_EXCEPTIONr   r   splitrange_URI_NAMED_CONVERTED_COMPONENTr   groups	TypeErrorr#   appendformat_URI_NAMED_COMPONENT_URI_COMPONENTURI_TYPE_WILDCARD_typejoinrecompile_pattern_namesURI_TYPE_EXACT_uri_target_options_check_types)selfr   r   r   r    
components_URI_COMP_CHARSplncgroup_counti	componentr   name	comp_typepr   r   r   __init__   s   







zPattern.__init__c                 C      | j S )z
        Returns the Options instance (if present) for this pattern.

        :return: None or the Options instance
        :rtype: None or RegisterOptions or SubscribeOptions
        )r>   r@   r   r   r   r         	zPattern.optionsc                 C   rL   )z
        Returns the URI type of this pattern

        :return:
        :rtype: Pattern.URI_TYPE_EXACT, Pattern.URI_TYPE_PREFIX or Pattern.URI_TYPE_WILDCARD
        )r5   rM   r   r   r   uri_type   rN   zPattern.uri_typec                 C   rL   )z
        Returns the original URI (pattern) for this pattern.

        :returns: The URI (pattern), e.g. ``"com.myapp.product.<product:int>.update"``.
        :rtype: str
        )r<   rM   r   r   r   r     s   zPattern.uric                 C   sx   g }i }| j tjkr||fS | j tjkr:| j|}|r6| jD ]}||}| j| |}|||< q||fS tddS )a-  
        Match the given (fully qualified) URI according to this pattern
        and return extracted args and kwargs.

        :param uri: The URI to match, e.g. ``"com.myapp.product.123456.update"``.
        :type uri: str

        :returns: A tuple ``(args, kwargs)``
        :rtype: tuple
        zno matchN)	r5   r   r;   r4   r9   r   r:   group
ValueError)r@   r   argskwargsr   keyvalr   r   r   r     s   


zPattern.matchc                 C      | j tjkS )z
        Check if this pattern is for a procedure endpoint.

        :returns: ``True``, iff this pattern is for a procedure endpoint.
        :rtype: bool
        )r=   r   r(   rM   r   r   r   is_endpoint/     zPattern.is_endpointc                 C   rV   )z
        Check if this pattern is for an event handler.

        :returns: ``True``, iff this pattern is for an event handler.
        :rtype: bool
        )r=   r   r)   rM   r   r   r   
is_handler9  rX   zPattern.is_handlerc                 C   rV   )z
        Check if this pattern is for an exception.

        :returns: ``True``, iff this pattern is for an exception.
        :rtype: bool
        )r=   r   r*   rM   r   r   r   is_exceptionC  rX   zPattern.is_exceptionNN) __name__
__module____qualname____doc__r(   r)   r*   r;   URI_TYPE_PREFIXr4   r7   r8   r3   r2   r-   r   r#   r   r   r   r   boolrK   r   propertyr   rO   r   r   rW   rY   rZ   r   r   r   r   r   Z   sD    



p		
	
	
	r   r   r    c                        fdd}|S )a  
    Decorator for WAMP procedure endpoints.

    :param uri:
    :type uri: str

    :param options:
    :type options: None or RegisterOptions

    :param check_types: Enable automatic type checking against (Python 3.5+) type hints
        specified on the ``endpoint`` callable. Types are checked at run-time on each
        invocation of the ``endpoint`` callable. When a type mismatch occurs, the error
        is forwarded to the callee code in ``onUserError`` override method of
        :class:`autobahn.wamp.protocol.ApplicationSession`. An error
        of type :class:`autobahn.wamp.exception.TypeCheckError` is also raised and
        returned to the caller (via the router).
    :type check_types: bool
    c                    sR   t | sJ d u rd| j}n}t| dsg | _| jt|tj  | S )Nz{}	_wampuris)callabler1   r\   hasattrrd   r0   r   r(   )freal_urir    r   r   r   r   decorateb  s   
zregister.<locals>.decorater   r   r   r    rj   r   ri   r   r   N  s   
r   c                    rc   )a  
    Decorator for WAMP event handlers.

    :param uri:
    :type uri: str

    :param options:
    :type options: None or SubscribeOptions

    :param check_types: Enable automatic type checking against (Python 3.5+) type hints
        specified on the ``endpoint`` callable. Types are checked at run-time on each
        invocation of the ``endpoint`` callable. When a type mismatch occurs, the error
        is forwarded to the callee code in ``onUserError`` override method of
        :class:`autobahn.wamp.protocol.ApplicationSession`. An error
        of type :class:`autobahn.wamp.exception.TypeCheckError` is also raised and
        returned to the caller (via the router).
    :type check_types: bool
    c                    s8   t | sJ t| dsg | _| jttj  | S Nrd   )re   rf   rd   r0   r   r)   )rg   ri   r   r   rj     s
   
zsubscribe.<locals>.decorater   rk   r   ri   r   r	   o  s   r	   c                    s    fdd}|S )z+
    Decorator for WAMP error classes.
    c                    s6   t | tsJ t| dsg | _| jt tj | S rl   )
issubclass	Exceptionrf   rd   r0   r   r*   )clsr   r   r   rj     s
   
zerror.<locals>.decorater   )r   rj   r   rp   r   r
     s   r
   r[   )r7   typingr   r   autobahn.utilr   autobahn.wamp.typesr   r   __all__r   r   objectr   ra   r   r	   r
   r   r   r   r   <module>   s   	/ t& &