U
    dR…fo	  ã                   @   s(   d dl mZmZmZ G dd„ deƒZdS )é    )ÚTApplicationExceptionÚTTypeÚTMessageTypec                   @   s<   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ ZdS )ÚTAsyncProcessorc                 C   s   || _ || _d S ©N)Ú_serviceÚ_handler)ÚselfZserviceÚhandler© r   úC/tmp/pip-unpacked-wheel-jqs7l_7o/thriftpy2/contrib/aio/processor.pyÚ__init__   s    zTAsyncProcessor.__init__c                 ƒ   sÊ   |  ¡ I d H \‰ }}ˆ ˆjjkrR| tj¡I d H  | ¡ I d H  ˆ |ttjƒd fS t	ˆjˆ d ƒƒ ‰| 
ˆ¡I d H  | ¡ I d H  t	ˆjˆ d ƒƒ }‡fdd„tˆjƒD ƒ‰‡ ‡‡‡fdd„}ˆ |||fS )NÚ_argsZ_resultc                    s   g | ]}ˆ j | d  ‘qS )é   )Úthrift_spec©Ú.0Úk©Úargsr   r   Ú
<listcomp>   s     z.TAsyncProcessor.process_in.<locals>.<listcomp>c                  “   s(   t ˆjˆ ƒ} | ‡fdd„ˆD ƒŽ I d H S )Nc                 3   s   | ]}ˆ j | V  qd S r   )Ú__dict__r   r   r   r   Ú	<genexpr>   s     z;TAsyncProcessor.process_in.<locals>.call.<locals>.<genexpr>)Úgetattrr   )Úf©ÚapiZapi_argsr   r	   r   r   Úcall   s    z(TAsyncProcessor.process_in.<locals>.call)Zread_message_beginr   Zthrift_servicesÚskipr   ZSTRUCTZread_message_endr   ZUNKNOWN_METHODr   Zread_structÚsortedr   )r	   ÚiprotÚtypeÚseqidÚresultr   r   r   r   Ú
process_in   s    zTAsyncProcessor.process_inc                 Ã   s6   |  |tj|¡ | |¡ | ¡  |j ¡ I d H  d S r   )Úwrite_message_beginr   Z	EXCEPTIONÚwriteÚwrite_message_endÚtransÚflush)r	   Úoprotr   Úexcr"   r   r   r   Úsend_exception    s    
zTAsyncProcessor.send_exceptionc                 Ã   s6   |  |tj|¡ | |¡ | ¡  |j ¡ I d H  d S r   )r%   r   ZREPLYZwrite_structr'   r(   r)   )r	   r*   r   r#   r"   r   r   r   Úsend_result&   s    
zTAsyncProcessor.send_resultc                 C   sV   t |jƒD ]F}|j| d dkr"q
|j| \}}}}t||ƒr
t|||ƒ  dS q
dS )Nr   ÚsuccessTF)r   r   Ú
isinstanceÚsetattr)r	   Úer#   r   Ú_Zexc_nameZexc_clsr   r   r   Úhandle_exception,   s    
z TAsyncProcessor.handle_exceptionc              
   Ã   sœ   |   |¡I d H \}}}}t|tƒr8|  ||||¡I d H S z|ƒ I d H |_W n0 tk
rz } z|  ||¡sj‚ W 5 d }~X Y nX |js˜|  ||||¡I d H  d S r   )	r$   r/   r   r,   r.   Ú	Exceptionr3   Zonewayr-   )r	   r    r*   r   r"   r#   r   r1   r   r   r   Úprocess7   s    
zTAsyncProcessor.processN)	Ú__name__Ú
__module__Ú__qualname__r   r$   r,   r-   r3   r5   r   r   r   r   r      s   r   N)Zthriftpy2.thriftr   r   r   Úobjectr   r   r   r   r   Ú<module>   s   