
    tAc                         d 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 ddlmZ dee         d	e	eeef         geee                  f         fd
ZdS )z.Utilities for union (sum type) disambiguation.    )OrderedDict)reduce)or_)AnyCallableDictMappingOptionalType)NOTHINGfields)
get_originclassesreturnc                     t          |           dk     rt          d          d | D             }t          d |D                       dk    rt          d          t                      |                    d            d	t	          |          D ]\  }\  }}||dz   d	         }|rt          t          d
 |D                       }||z
  }|s$d                    |          }t          |          t          t          |          p|          }	|D ] }
t          |	|
          j        t          u r n!t          | d          ||
<   |dt          t          t          f         dt          t                    ffd}|S )zdGiven attr classes, generate a disambiguation function.

    The function is based on unique fields.   zAt least two classes required.c                 |    g | ]9}|t          d  t          t          |          p|          D                       f:S )c              3   $   K   | ]}|j         V  d S )N)name).0ats     7/usr/lib/python3/dist-packages/cattrs/disambiguators.py	<genexpr>z8create_uniq_field_dis_func.<locals>.<listcomp>.<genexpr>   s$      @@R@@@@@@    )setr   r   )r   cls     r   
<listcomp>z.create_uniq_field_dis_func.<locals>.<listcomp>   sT       FHS@@6*R..*>B#?#?@@@@@A  r   c                 >    g | ]\  }}t          |          d k    |S )r   len)r   _attrss      r   r   z.create_uniq_field_dis_func.<locals>.<listcomp>   s'    CCCha3u::??E???r      z(At least two classes have no attributes.c                 .    t          | d                    S )Nr#   r   )c_as    r   <lambda>z,create_uniq_field_dis_func.<locals>.<lambda>   s    CF| r   )keyNc              3   &   K   | ]}|d          V  dS )r#   N )r   r%   s     r   r   z-create_uniq_field_dis_func.<locals>.<genexpr>#   s&      %F%Fc!f%F%F%F%F%F%Fr   z#{} has no usable unique attributes.z& has no usable non-default attributes.datar   c                     t          | t                    st          d                                          D ]\  }}|| v r|c S S )Nz"Only input mappings are supported.)
isinstancer	   
ValueErroritems)r*   kvfallbackuniq_attrs_dicts      r   dis_funcz,create_uniq_field_dis_func.<locals>.dis_func3   s`    $(( 	CABBB#))++ 	 	DAqDyy r   )r    r-   r   sort	enumerater   r   formatr   r   getattrdefaultr   r	   r   r
   r   )r   cls_and_attrsir   cl_reqsother_classes
other_reqsuniqm	cl_fields	attr_namer3   r1   r2   s               @@r   create_uniq_field_dis_funcrB      s    7||a9::: LS  M CC-CCCDDqHHCDDD (3}}O33444H%m44  =B%a!egg. 	%F%F%F%F%FGGJZ'D $9@@DD mm#z"~~344I! P P	9i008GCCE D !B!N!N!NOOO)+OI&&HHwsCx( Xd^        Or   N)__doc__collectionsr   	functoolsr   operatorr   typingr   r   r   r	   r
   r   attrr   r   cattrs._compatr   rB   r)   r   r   <module>rJ      s    4 4 # # # # # #             ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?                 % % % % % %/3i/wsCx !8DI#667/ / / / / /r   