o
    "i                     @  s   d Z ddlmZ ddlmZ ddlmZ ddlmZ ddl	m
Z
 ddlmZ ddlmZmZmZmZmZmZ dd	lmZmZmZ d
dlmZmZmZmZmZmZmZ d
dl m!Z! er`d
dl"m#Z# ddgZ$d/ddZ%dddd0d dZ&e&Z'd1d&d'Z(d2d,d-Z)d.S )3z.Utilities for union (sum type) disambiguation.    )annotations)defaultdict)Mapping)MISSING)reduce)or_)TYPE_CHECKINGAnyCallableLiteralUnion
get_origin)NOTHING	AttributeAttrsInstance   )NoneTypeadapted_fieldsfields_dictget_argshas
is_literalis_union_type)AttributeOverride)BaseConvertercreate_default_dis_funcis_supported_uniontypr	   returnboolc                 C  s   t | otdd | jD S )z<Whether the type is a union of attrs classes or dataclasses.c                 s  s(    | ]}|t u ptt|p|V  qd S N)r   r   r   ).0e r#   U/var/www/html/premium_crap/venv/lib/python3.10/site-packages/cattrs/disambiguators.py	<genexpr>!   s    
z%is_supported_union.<locals>.<genexpr>)r   all__args__)r   r#   r#   r$   r      s   Tfrom_converter)use_literals	overrides	converterr   classestype[AttrsInstance]r)   r*   8dict[str, AttributeOverride] | Literal['from_converter']/Callable[[Mapping[Any, Any]], type[Any] | None]c                  sF  t |dk r
tddkrfdd|D n	fdd|D |rdd |D }|d }|D ]}||M }q0d	}d	 |D ]@}tt}	|D ]tttpN| jD ]	}
|	|
  qTqE|d	u syt	d
d |	
 D t	d
d |
 D kr}|	}| q=|r rt	dd |
 D t |krdd | D d  fdd}|S dd t|D }i |jdd dd d	|D ]M\}}fdd|D }ttdd |D t }|| }ttp}|D ]}|| }|| jttfv r nqd	u rqt d|< qd	u rd!fdd}|S d!fdd}|S )"a~  Given attrs classes or dataclasses, generate a disambiguation function.

    The function is based on unique fields without defaults or unique values.

    :param use_literals: Whether to try using fields annotated as literals for
        disambiguation.
    :param overrides: Attribute overrides to apply.

    .. versionchanged:: 24.1.0
        Dataclasses are now supported.
       zAt least two classes required.r(   c                   s   g | ]}t  |d i qS r*   )getattrget_structure_hook)r!   c)r+   r#   r$   
<listcomp>=   s    z+create_default_dis_func.<locals>.<listcomp>c                   s   g | ]} qS r#   r#   )r!   _r1   r#   r$   r5   A   s    c                 S  s&   g | ]}d d t t|p|D qS )c                 S  s   h | ]
}t |jr|jqS r#   )r   typename)r!   atr#   r#   r$   	<setcomp>I   s    z5create_default_dis_func.<locals>.<listcomp>.<setcomp>)r   r   )r!   clr#   r#   r$   r5   H   s    r   Nc                 s      | ]}t |V  qd S r    lenr!   vr#   r#   r$   r%   b       z*create_default_dis_func.<locals>.<genexpr>c                 s  r<   r    r=   r?   r#   r#   r$   r%   k   rA   c                 S  s2   i | ]\}}|t |d kr|d ntt| qS )r   r   )r>   r   tuple)r!   kr@   r#   r#   r$   
<dictcomp>m   s     z+create_default_dis_func.<locals>.<dictcomp>dataMapping[Any, Any]r   type | Nonec                   s   t | ts	td|    S )Nz"Only input mappings are supported.)
isinstancer   
ValueError)rE   )best_discriminatorfinal_mappingr#   r$   dis_funcr   s   
z)create_default_dis_func.<locals>.dis_funcc                 S  s"   g | ]\}}|gt ||R qS r#   )_usable_attribute_names)r!   r;   overrider#   r#   r$   r5   }   s    c                 S  s   t | d S )Nr   r=   )c_ar#   r#   r$   <lambda>   s    z)create_default_dis_func.<locals>.<lambda>T)keyreversec                   s,   g | ]}|d   ur|d    vr|qS )r   )values)r!   c_and_a)r;   uniq_attrs_dictr#   r$   r5      s
    c                 s  s    | ]}|d  V  qdS )r   Nr#   )r!   rO   r#   r#   r$   r%      rA   z% has no usable non-default attributestype[AttrsInstance] | Nonec                   s<   t | ts	td  D ]\}}|| v r|  S qtd)N!Only input mappings are supportedzCouldn't disambiguaterH   r   rI   itemsrE   rC   r@   )rU   r#   r$   rL      s   
c                   s8   t | ts	td D ]\}}|| v r|  S q S )NrW   rX   rZ   )fallbackrU   r#   r$   rL      s   
)rE   rF   r   rG   )rE   rF   r   rV   )r>   rI   r   listr   r   r   r7   appendmaxrS   rY   zipsortr   r   setdefaultr   r   	TypeError)r+   r)   r*   r,   cls_candidatesdiscriminatorspossible_discriminatorsbest_resultdiscriminatormappingrQ   rL   cls_and_attrscl_reqsback_mapother_classes
other_reqsuniq	cl_fieldsmaybe_renamed_attr_name	orig_namer#   )rJ   r;   r+   r[   rK   r*   rU   r$   r   &   s   


$


r9   r   rN   AttributeOverride | Nonestrc                 C  s   |d u s	|j d u r| jS |j S r    )renamer8   )r9   rN   r#   r#   r$   _overriden_name   s   rv   r;   	type[Any]dict[str, AttributeOverride]tuple[set[str], dict[str, str]]c                 C  sN   t  }i }tt| p| D ]}|t|||j } |j||< q||fS )z<Return renamed fields and a mapping to original field names.)ra   r   r   addrv   getr8   )r;   r*   resri   r9   nr#   r#   r$   rM      s   rM   N)r   r	   r   r   )
r+   r   r,   r-   r)   r   r*   r.   r   r/   )r9   r   rN   rs   r   rt   )r;   rw   r*   rx   r   ry   )*__doc__
__future__r   collectionsr   collections.abcr   dataclassesr   	functoolsr   operatorr   typingr   r	   r
   r   r   r   attrsr   r   r   _compatr   r   r   r   r   r   r   genr   
convertersr   __all__r   r   create_uniq_field_dis_funcrv   rM   r#   r#   r#   r$   <module>   s,     $	

 
