o
    "i|                     @  s0  U d dl mZ d dlmZmZ d dlmZmZmZm	Z	m
Z
mZ d dlmZmZ ddlmZ ddlmZ er;ddlmZ eZd	ed
< eZd	ed< eZd	ed< eeegef Zd	ed< eegef Zd	ed< edeeZeegef Zd	ed< eG dd dZeG dd dZeddG dd de	e ZdS )    )annotations)	lru_cachesingledispatch)TYPE_CHECKINGAnyCallableGenericLiteralTypeVar)Factorydefine   )	TypeAlias)	Predicate)BaseConverterr   
TargetTypeUnstructuredValueStructuredValueStructureHookUnstructureHookHookHookFactoryc                   @  s   e Zd ZdZdS )_DispatchNotFoundz4A dummy object to help signify a dispatch not found.N)__name__
__module____qualname____doc__ r   r   O/var/www/html/premium_crap/venv/lib/python3.10/site-packages/cattrs/dispatch.pyr      s    r   c                   @  sZ   e Zd ZU dZded< eeZded< 		ddddZdddZ	d ddZ
d!d"ddZdS )#FunctionDispatcha  
    FunctionDispatch is similar to functools.singledispatch, but
    instead dispatches based on functions that take the type of the
    first argument in the method, and return True or False.

    objects that help determine dispatch should be instantiated objects.

    :param converter: A converter to be used for factories that require converters.

    ..  versionchanged:: 24.1.0
        Support for factories that require converters, hence this requires a
        converter when creating.
    r   
_converterz=list[tuple[Predicate, Callable[[Any, Any], Any], bool, bool]]_handler_pairsF	predicater   funcCallable[..., Any]returnNonec                 C  s   | j d||||f d S )Nr   )r!   insert)selfr"   r#   is_generatortakes_converterr   r   r   register3   s   zFunctionDispatch.registertypr   Callable[..., Any] | Nonec              	   C  sh   | j D ].\}}}}z||}W n	 ty   Y qw |r1|r-|r'||| j  S ||  S |  S qdS )zG
        Return the appropriate handler for the object passed.
        N)r!   	Exceptionr    )r(   r,   
can_handlehandlerr)   r*   chr   r   r   dispatch<   s   zFunctionDispatch.dispatchintc                 C  s
   t | jS N)lenr!   r(   r   r   r   get_num_fnsQ      
zFunctionDispatch.get_num_fnsr   otherskipc                 C  s   | j d |  |j  |_ d S r4   )r!   )r(   r9   r:   r   r   r   copy_toT   s   zFunctionDispatch.copy_toN)FF)r"   r   r#   r$   r%   r&   )r,   r   r%   r-   r%   r3   r   )r9   r   r:   r3   r%   r&   )r   r   r   r   __annotations__r   listr!   r+   r2   r7   r;   r   r   r   r   r      s   
 

	
r   F)initc                   @  s   e Zd ZU dZded< ded< ded< ded	< d
ed< d.ddZd/ddZd0d1ddZd2dd Zd3d!d"Z	d3d#d$Z
d4d&d'Zd5d6d+d,Zd-S )7MultiStrategyDispatcha  
    MultiStrategyDispatch uses a combination of exact-match dispatch,
    singledispatch, and FunctionDispatch.

    :param fallback_factory: A hook factory to be called when a hook cannot be
        produced.
    :param converter: A converter to be used for factories that require converters.

    .. versionchanged:: 23.2.0
        Fallbacks are now factories.
    .. versionchanged:: 24.1.0
        Support for factories that require converters, hence this requires a
        converter when creating.
    HookFactory[Hook]_fallback_factoryzdict[TargetType, Hook]_direct_dispatchr   _function_dispatchr   _single_dispatchz+Callable[[TargetType, BaseConverter], Hook]r2   fallback_factory	converterr   r%   r&   c                 C  s6   || _ i | _t|| _tt| _td d| j| _	d S )N)maxsize)
rC   rD   r   rE   r   r   rF   r   dispatch_without_cachingr2   )r(   rG   rH   r   r   r   __init__o   s
   

zMultiStrategyDispatch.__init__r,   r   r   c                 C  sl   z| j |}|tur|W S W n	 ty   Y nw | j|}|dur%|S | j|}|dur1|S | |S )z4Dispatch on the type but without caching the result.N)rF   r2   r   r.   rD   getrE   rC   )r(   r,   r2   direct_dispatchresr   r   r   rJ   x   s   z.MultiStrategyDispatch.dispatch_without_cachingFdirectboolc                 C  sB   |D ]\}}|r|| j |< q| j|| |   q| j  dS )z-Register a class to direct or singledispatch.N)rD   rF   r+   clear_directr2   cache_clear)r(   cls_and_handlerrO   clsr0   r   r   r   register_cls_list   s   
z'MultiStrategyDispatch.register_cls_listpred_and_handlerlist[tuple[Predicate, Any] | tuple[Predicate, Any, bool] | tuple[Predicate, Callable[[Any, BaseConverter], Any], Literal['extended']]]c                 C  s~   |D ]1}t |dkr|\}}| j|| q|\}}}|dkr*| jj|||dd q| jj|||d q|   | j  dS )a9  
        Register a predicate function to determine if the handler
        should be used for the type.

        :param pred_and_handler: The list of predicates and their associated
            handlers. If a handler is registered in `extended` mode, it's a
            factory that requires a converter.
           extendedT)r)   r*   )r)   N)r5   rE   r+   rQ   r2   rR   )r(   rV   tupr#   r0   is_genr   r   r   register_func_list   s   
z(MultiStrategyDispatch.register_func_listc                 C  s   | j   dS )zClear the direct dispatch.N)rD   clearr6   r   r   r   rQ      s   z"MultiStrategyDispatch.clear_directc                 C  s   | j   | j  dS )zClear all caches.N)rD   r]   r2   rR   r6   r   r   r   clear_cache   s   
z!MultiStrategyDispatch.clear_cacher3   c                 C  s
   | j  S r4   )rE   r7   r6   r   r   r   r7      r8   z!MultiStrategyDispatch.get_num_fnsr   r9   r:   c                 C  sB   | j j|j |d | jj D ]\}}|j|| q|  d S )N)r:   )rE   r;   rF   registryitemsr+   r^   )r(   r9   r:   rT   fnr   r   r   r;      s   zMultiStrategyDispatch.copy_toN)rG   rB   rH   r   r%   r&   )r,   r   r%   r   )F)rO   rP   r%   r&   )rV   rW   )r%   r&   r<   r=   )r9   rA   r:   r3   r%   r&   )r   r   r   r   r>   rK   rJ   rU   r\   rQ   r^   r7   r;   r   r   r   r   rA   X   s   
 

	




rA   N) 
__future__r   	functoolsr   r   typingr   r   r   r   r	   r
   attrsr   r   _compatr   fnsr   
convertersr   r   r>   r   r   r   r   r   r   r   r   rA   r   r   r   r   <module>   s*     9