U
    Zf`!                     @   s   d Z ddlmZmZ ddlZddlmZ dZer8ddl	Z	G dd de
Zerde	jded	Ze	d
ZG dd de
Ze Ze
 ZG dd de
ZG dd de
ZG dd de
ZG dd de
ZejZdd Zdd Zdd Zdd ZdS )z6
Helpers for representing Stone data types in Python.
    )absolute_importunicode_literalsN)stone_validatorsFc                   @   s   e Zd ZdS )AnnotationTypeN)__name__
__module____qualname__ r	   r	   I/tmp/pip-unpacked-wheel-vqb3mfeu/stone/backends/python_rsrc/stone_base.pyr      s   r   T)boundUc                   @   s(   e Zd ZdZdd Zdd Zdd ZdS )	NotSetr	   c                 C   s   | S Nr	   selfr	   r	   r
   __copy__   s    zNotSet.__copy__c                 C   s   | S r   r	   )r   memor	   r	   r
   __deepcopy__    s    zNotSet.__deepcopy__c                 C   s   dS )NNOT_SETr	   r   r	   r	   r
   __repr__%   s    zNotSet.__repr__N)r   r   r   	__slots__r   r   r   r	   r	   r	   r
   r      s   r   c                   @   s2   e Zd ZdZdddZdd Zdd Zd	d
 ZdS )	Attribute)namedefaultnullableuser_defined	validatorFc                 C   s(   d || _|| _|| _d | _t| _d S )N	_{}_value)formatr   r   r   r   
NO_DEFAULTr   )r   r   r   r   r	   r	   r
   __init__1   s
    zAttribute.__init__c                 C   sV   |d kr| S t || j}|tk	r$|S | jr.d S | jtk	r>| jS tdt| jd S )Nzmissing required field '{}')	getattrr   r   r   r   r    AttributeErrorr   public_name)r   instanceownervaluer	   r	   r
   __get__;   s    
zAttribute.__get__c                 C   sR   | j r |d kr t|| jt d S | jr4| j| n| j|}t|| j| d S r   )r   setattrr   r   r   r   validate_type_onlyvalidate)r   r%   r'   r	   r	   r
   __set__I   s    zAttribute.__set__c                 C   s   t || jt d S r   )r)   r   r   )r   r%   r	   r	   r
   
__delete__T   s    zAttribute.__delete__N)FF)r   r   r   r   r!   r(   r,   r-   r	   r	   r	   r
   r   .   s
   

r   c                   @   s6   e Zd ZdZe Zdd Zdd Zdd Zdd	 Z	d
S )Structr	   c                 C   sd   t |tsdS | j|jkrdS t || js:t | |js:dS | jD ]}t| |t||kr@ dS q@dS )NFT)
isinstancer.   _all_field_names_	__class__r"   )r   other
field_namer	   r	   r
   __eq__b   s    

zStruct.__eq__c                 C   s
   | |k S r   r	   r   r2   r	   r	   r
   __ne__s   s    zStruct.__ne__c                    s0    fddt  jD }dt jd|S )Nc              
      s$   g | ]}d  |t d |qS )z{}={!r}r   )r   r"   ).0r   r   r	   r
   
<listcomp>x   s   z#Struct.__repr__.<locals>.<listcomp>z{}({})z, )sortedr0   r   typer   join)r   argsr	   r   r
   r   w   s    
zStruct.__repr__c                 C   s   d S r   r	   r   annotation_type
field_path	processorr	   r	   r
   _process_custom_annotations|   s    z"Struct._process_custom_annotationsN)
r   r   r   r   setr0   r4   r6   r   rA   r	   r	   r	   r
   r.   Y   s   r.   c                   @   sh   e Zd ZddgZi Ze ZdddZdd Zdd	 Z	d
d Z
dd Zdd Zedd Zedd ZdS )Union_tag_valueNc                 C   s   d }dd | j D }dg| D ] }|t| |krt| || }q|d k	sTtd| t|tjrr|d kstdn(t|tjtjfr|| n
|	| || _
|| _d S )Nc                 S   s   g | ]}d  |qS )
_{}_tagmapr   )r7   Zmap_namer	   r	   r
   r8      s     z"Union.__init__.<locals>.<listcomp>_tagmapzInvalid tag %r.z,Void type union member must have None value.)_permissioned_tagmapsr"   AssertionErrorr/   bvZVoidr.   rC   r*   r+   rD   rE   )r   tagr'   r   Ztagmap_namestagmap_namer	   r	   r
   r!      s    
zUnion.__init__c                 C   s:   t |to8t | |js"t || jo8| j|jko8| j|jkS r   )r/   rC   r1   rD   rE   r5   r	   r	   r
   r4      s    


zUnion.__eq__c                 C   s
   | |k S r   r	   r5   r	   r	   r
   r6      s    zUnion.__ne__c                 C   s   t | j| jfS r   )hashrD   rE   r   r	   r	   r
   __hash__   s    zUnion.__hash__c                 C   s   d t| j| j| jS )Nz{}({!r}, {!r}))r   r:   r   rD   rE   r   r	   r	   r
   r      s    zUnion.__repr__c                 C   s   d S r   r	   r=   r	   r	   r
   rA      s    z!Union._process_custom_annotationsc                 C   sV   |d k	st d|| jkrdS |jD ],}d|}t| |r$|t| |kr$ dS q$dS )Ntag value should not be NoneTrF   F)rJ   rH   permissionsr   hasattrr"   clsrL   Zcaller_permissionsZextra_permissionrM   r	   r	   r
   _is_tag_present   s    


zUnion._is_tag_presentc                 C   sZ   |d k	st d|jD ]8}d|}t| |r|t| |krt| ||   S q| j| S )NrP   rF   )rJ   rQ   r   rR   r"   rH   rS   r	   r	   r
   _get_val_data_type   s    

zUnion._get_val_data_type)N)r   r   r   r   rH   rB   rI   r!   r4   r6   rO   r   rA   classmethodrU   rV   r	   r	   r	   r
   rC      s   
	
rC   c                   @   s    e Zd ZdZdd Zdd ZdS )Route)r   version
deprecatedarg_typeresult_type
error_typeattrsc                 C   sD   || _ || _|| _|| _|| _|| _t|ts:td| || _	d S )NzExpected dict, got %r)
r   rY   rZ   r[   r\   r]   r/   dictrJ   r^   )r   r   rY   rZ   r[   r\   r]   r^   r	   r	   r
   r!      s    zRoute.__init__c              	   C   s$   d | j| j| j| j| j| j| jS )Nz/Route({!r}, {!r}, {!r}, {!r}, {!r}, {!r}, {!r}))r   r   rY   rZ   r[   r\   r]   r^   r   r	   r	   r
   r      s    zRoute.__repr__N)r   r   r   r   r!   r   r	   r	   r	   r
   rX      s   
rX   c                    s    fdd}|S )Nc                    s   |d kr|S |  |  |S r   )rA   )r?   structr>   r@   r	   r
   g   s    z+make_struct_annotation_processor.<locals>.gr	   )r>   r@   rb   r	   ra   r
    make_struct_annotation_processor   s    rc   c                    s    fdd}|S )Nc                    s$   |d kr|S  fddt |D S )Nc                    s"   g | ]\}}d   ||qS z{}[{}]rG   )r7   idxxr?   r@   r	   r
   r8      s     z=make_list_annotation_processor.<locals>.g.<locals>.<listcomp>)	enumerate)r?   list_r@   r?   r
   rb      s    z)make_list_annotation_processor.<locals>.gr	   r@   rb   r	   rj   r
   make_list_annotation_processor   s    rm   c                    s    fdd}|S )Nc                    s$   |d kr|S  fdd|  D S )Nc              	      s(   i | ] \}}|d   t||qS rd   )r   repr)r7   kvrg   r	   r
   
<dictcomp>   s      zBmake_map_value_annotation_processor.<locals>.g.<locals>.<dictcomp>)items)r?   Zmap_rj   rk   r
   rb      s    z.make_map_value_annotation_processor.<locals>.gr	   rl   r	   rj   r
   #make_map_value_annotation_processor   s    rs   c                 C   s   d | ddd S )N_   )r;   split)r   r	   r	   r
   r$      s    r$   )__doc__
__future__r   r   	functoolsZstone.backends.python_rsrcr   rK   Z_MYPYtypingobjectr   TypeVarr   r   r   r   r    r   r.   rC   rX   partialZpartially_applyrc   rm   rs   r$   r	   r	   r	   r
   <module>   s,   
+'F