U
    dRfEB                     @   sv  d dl mZ d dlZd dlZd dlmZmZ d dlZddlm	Z	m
Z
 ddlmZ ddlmZ d ZdZdZd	Zd
ZdZdZdZdZe
je
jfZdd Zdd Zdd Zdd Zdd ZG dd de Z!e
j"e!j"e
j#e!j$e
j%e!j%e
j&e!j&e
j'e!j'e
j(e!j(e
j)e!j)e
je!je
j*e!j*e
j+e!j+e
j,e!j,e
j-e!j-e
je!jiZ.e/dd e.0 D Z1e
j#e1e!j2< G dd deZ3G dd  d e Z4dS )!    )absolute_importN)packunpack   )
TExceptionTType   )TProtocolBase)TProtocolException                  c                 C   s   |dkr&| dk s| dkr&t t jdnp|dkrL| dk s>| dkrLt t jdnJ|d	krr| d
k sd| dkrrt t jdn$|dkr| dk s| dkrt t jdd S )Nr      z!i8 requires -128 <= number <= 127   i i  z&i16 requires -32768 <= number <= 32767    i   iz0i32 requires -2147483648 <= number <= 2147483647@   l         l    zVi64 requires -9223372036854775808 <= number <=                     9223372036854775807)r
   ZINVALID_DATA)ibits r   >/tmp/pip-unpacked-wheel-jqs7l_7o/thriftpy2/protocol/compact.pycheck_integer_limits   s$    r   c                 C   s   t | | | d> | |d ? A S Nr   )r   )nr   r   r   r   make_zig_zag.   s    
r   c                 C   s   | d? | d@  A S r   r   )r   r   r   r   from_zig_zag3   s    r   c                 C   sX   g }|d@ dkr| | q:q| |d@ dB  |d? }qtd|}| |  d S )Nr   r         r   B)appendarraywritetobytes)transr   outdatar   r   r   write_varint7   s    

r)   c                 C   sH   d}d}|  d}t|}||d@ |> O }|d? dkr:|S |d7 }qd S )Nr   r   r   r   )readord)r&   resultshiftxbyter   r   r   read_varintE   s    
r0   c                   @   s@   e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zd
ZdZdZdZdS )CompactTyper   r   r   r   r   r   r   r   r   	   
         N)__name__
__module____qualname__STOPTRUEFALSEBYTEI16I32I64DOUBLEBINARYLISTSETMAPSTRUCTr   r   r   r   r1   R   s   r1   c                 c   s   | ]\}}||fV  qd S Nr   ).0kvr   r   r   	<genexpr>q   s     rJ   c                   @   s  e Zd ZdZdZdZdZdZdZdZ	ded
dZ
dd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zd d! Zd"d# Zd$d% Zd&d' Zd(d) Zd*d+ Zd,d- Zd.d/ Zd0d1 Zdfd3d4Zd5d6 Zd7d8 Z d9d: Z!d;d< Z"d=d> Z#d?d@ Z$dAdB Z%dCdD Z&dEdF Z'dGdH Z(dIdJ Z)dKdL Z*dMdN Z+dOdP Z,dQdR Z-dSdT Z.dUdV Z/dWdX Z0dYdZ Z1d[d\ Z2d]d^ Z3d_d` Z4dgdadbZ5dcdd Z6d2S )hTCompactProtocolz5Compact implementation of the Thrift protocol driver.   r         r   r   TFc                 C   s4   t | | d| _d | _d | _g | _|| _|| _d S Nr   )r	   __init__	_last_fid	_bool_fid_bool_value_structsdecode_responsestrict_decode)selfr&   rU   rV   r   r   r   rP   ~   s    zTCompactProtocol.__init__c                 C   s   t |d@  S )N   )TTYPESrW   r/   r   r   r   
_get_ttype   s    zTCompactProtocol._get_ttypec                 C   s   t | j}|dk rtd|S )Nr   z
Length < 0)r0   r&   r   rW   r,   r   r   r   
_read_size   s    
zTCompactProtocol._read_sizec                 C   s   |   }|| jkr"ttjd| |   }|| j? | j@ }|| j@ }|| jkrdttjd|| jf t| j	}| 
 }|||fS )Nz"Bad protocol id in the message: %dzBad version: %d (expect %d))_read_ubytePROTOCOL_IDr
   ZBAD_VERSIONTYPE_SHIFT_AMOUNT	TYPE_BITSVERSION_MASKVERSIONr0   r&   _read_string)rW   Zproto_idZver_typetypeversionseqidnamer   r   r   read_message_begin   s&    



z#TCompactProtocol.read_message_beginc                 C   s   t | jdkstd S rO   )lenrT   AssertionErrorrW   r   r   r   read_message_end   s    z!TCompactProtocol.read_message_endc                 C   s   |   }|d@ tjkrdS |d? }|dkr:tt| j}n
| j| }|| _|d@ }|tjkrdd| _	n|tj
krtd| _	d | ||fS )NrX   )Nr   r   r   r   TF)r^   r   r9   r   r0   r&   rQ   r1   r:   rS   r;   r[   )rW   re   deltafidr   r   r   _read_field_begin   s    


z"TCompactProtocol._read_field_beginc                 C   s   d S rF   r   rl   r   r   r   _read_field_end   s    z TCompactProtocol._read_field_endc                 C   s   | j | j d| _d S rO   rT   r"   rQ   rl   r   r   r   _read_struct_begin   s    z#TCompactProtocol._read_struct_beginc                 C   s   | j  | _d S rF   rT   poprQ   rl   r   r   r   _read_struct_end   s    z!TCompactProtocol._read_struct_endc                 C   s>   |   }d}|dkr|  }| |}| |d? }|||fS Nr   r   )r]   r^   r[   )rW   sizetypesvtypektyper   r   r   _read_map_begin   s    
z TCompactProtocol._read_map_beginc                 C   s2   |   }|d? }| |}|dkr*|  }||fS )Nr   rX   )r^   r[   r]   )rW   Z	size_typerx   re   r   r   r   _read_collection_begin   s    
z'TCompactProtocol._read_collection_beginc                 C   s   d S rF   r   rl   r   r   r   _read_collection_end   s    z%TCompactProtocol._read_collection_endc                 C   s   t d| jd\}|S )N!br   r   r&   r*   r\   r   r   r   
_read_byte   s    zTCompactProtocol._read_bytec                 C   s   t d| jd\}|S )N!Br   r   r\   r   r   r   r^      s    zTCompactProtocol._read_ubytec                 C   s   t t| jS rF   )r   r0   r&   rl   r   r   r   	_read_int   s    zTCompactProtocol._read_intc                 C   s   | j d}td|\}|S )Nr   <d)r&   r*   r   )rW   Zbuffvalr   r   r   _read_double   s    zTCompactProtocol._read_doublec                 C   s   |   }| j|S rF   )r]   r&   r*   )rW   lengthr   r   r   _read_binary   s    zTCompactProtocol._read_binaryc                 C   sJ   |   }| j|}| jrFz|d}W n tk
rD   | jr@ Y nX |S Nzutf-8)r]   r&   r*   rU   decodeUnicodeDecodeErrorrV   )rW   rj   Zbyte_payloadr   r   r   rd      s    zTCompactProtocol._read_stringc                 C   s(   | j d k	r| j }d | _ |S |  tjkS rF   )rS   r   r1   r:   r\   r   r   r   
_read_bool   s
    
zTCompactProtocol._read_boolc                 C   s   |    |  \}}}|tjkr"q||jkr8| | qz|j| }W n  tk
rf   | |  Y nbX |d k	r||d ks|tkr|d tkr|d }|d }| |d |}t	||| n
| | | 
  q|   d S )Nr   r   r   )rs   rp   r   r9   thrift_specskip
IndexError	BIN_TYPES	_read_valsetattrrq   rv   )rW   objfnameftypero   fieldfspecr   r   r   r   read_struct   s4    







zTCompactProtocol.read_structNc                 C   s  |t jkr|  S |t jkr$|  S |t jt jt jfkr@|  S |t j	krR| 
 S |t jkrd|  S |t jkrv|  S |t jt jfk rt|tr|d |d  }}n
|d  }}g }|  \}}t|D ]}|| || q|   |S |t jkrt|d tr|d }	d }
n|d \}	}
t|d tr@|d }d }n|d \}}i }|  \}}}|tkrl|	}|tkrz|}||	ks||krt|D ]}| | | | q|   i S t|D ]&}| |	|
}| ||}|||< q|   |S |t jkr| }| | |S d S Nr   r   )r   BOOLr   r<   r   r=   r>   r?   r   r@   r   rA   r   STRINGrd   rB   rC   
isinstancetupler}   ranger"   r   r~   rD   intr|   r   r   rE   r   )rW   ttypespecv_typev_specr,   Zr_typeszr   k_typek_specZsk_typeZsv_type_Zk_valZv_valr   r   r   r   r     sj    










zTCompactProtocol._read_valc                 C   s   t | j| d S rF   )r)   r&   rW   Zi32r   r   r   _write_sizec  s    zTCompactProtocol._write_sizec                 C   sT   || j  }d|  k rdkr6n n| |d> |B  n| | | | || _ d S )Nr   rX   r   )rQ   _write_ubyte_write_byte
_write_i16)rW   re   ro   rn   r   r   r   _write_field_headerf  s    


z$TCompactProtocol._write_field_headerc                 C   s<   |  | j |  | j|| j> B  t| j| | | d S rF   )r   r_   rc   r`   r)   r&   _write_string)rW   rh   re   rg   r   r   r   write_message_begino  s    z$TCompactProtocol.write_message_beginc                 C   s   d S rF   r   rl   r   r   r   write_message_endu  s    z"TCompactProtocol.write_message_endc                 C   s   |  d d S rO   )r   rl   r   r   r   _write_field_stopx  s    z"TCompactProtocol._write_field_stopc                 C   s&   |t jkr|| _n| t| | d S rF   )r   r   rR   r   CTYPES)rW   rh   re   ro   r   r   r   _write_field_begin{  s    
z#TCompactProtocol._write_field_beginc                 C   s   d S rF   r   rl   r   r   r   _write_field_end  s    z!TCompactProtocol._write_field_endc                 C   s   | j | j d| _d S rO   rr   rl   r   r   r   _write_struct_begin  s    z$TCompactProtocol._write_struct_beginc                 C   s   | j  | _d S rF   rt   rl   r   r   r   _write_struct_end  s    z"TCompactProtocol._write_struct_endc                 C   s@   |dkr |  |d> t| B  n|  dt| B  | | d S )N   r      )r   r   r   )rW   etyperx   r   r   r   _write_collection_begin  s    z(TCompactProtocol._write_collection_beginc                 C   s<   |dkr|  d n$| | | t| d> t| B  d S rw   )r   r   r   r   )rW   r{   rz   rx   r   r   r   _write_map_begin  s    
z!TCompactProtocol._write_map_beginc                 C   s   d S rF   r   rl   r   r   r   _write_collection_end  s    z&TCompactProtocol._write_collection_endc                 C   s   | j td| d S )Nr   r&   r$   r   rZ   r   r   r   r     s    zTCompactProtocol._write_ubytec                 C   s   | j td| d S )Nr   r   rZ   r   r   r   r     s    zTCompactProtocol._write_bytec                 C   s>   |r
t jnt j}| jd k	r0| || j d | _n
| | d S rF   )r1   r:   r;   rR   r   r   )rW   boolctyper   r   r   _write_bool  s
    
zTCompactProtocol._write_boolc                 C   s   t | jt|d d S )Nr   r)   r&   r   )rW   Zi16r   r   r   r     s    zTCompactProtocol._write_i16c                 C   s   t | jt|d d S )Nr   r   r   r   r   r   
_write_i32  s    zTCompactProtocol._write_i32c                 C   s   t | jt|d d S )Nr   r   )rW   Zi64r   r   r   
_write_i64  s    zTCompactProtocol._write_i64c                 C   s   | j td| d S )Nr   r   )rW   Zdubr   r   r   _write_double  s    zTCompactProtocol._write_doublec                 C   s@   |  t| t|tjr0tjd dkr0| }| j	| d S )Nr   r   )
r   rj   r   sixstring_typessysversion_infoencoder&   r$   )rW   br   r   r   _write_binary  s    zTCompactProtocol._write_binaryc                 C   s2   t |ts|d}| t| | j| d S r   )r   bytesr   r   rj   r&   r$   )rW   sr   r   r   r     s    

zTCompactProtocol._write_stringc           
      C   s   |    |jD ]z}|d krq|j| }t|dkrB|\}}}d }n|\}}}}t||d }	|	d krdq| ||| | ||	| |   q|   |   d S )Nr   )	r   r   rj   getattrr   
_write_valr   r   r   )
rW   r   r   r   r   r   freqZf_container_specZf_reqr   r   r   r   write_struct  s"    



zTCompactProtocol.write_structc                 C   s  |t jkr| | n|t jkr0| | n|t jkrH| | n|t jkr`| | n|t j	krx| 
| n|t jkr| | nh|t jkr| | nP|t jkr| | n8|t jks|t jkr6t|tr|d |d  }}n
|d  }}t|}| || |D ]}| ||| q|   n|t jkrt|d tr`|d }d }	n|d \}}	t|d tr|d }
d }n|d \}
}| ||
t| t|D ]&}| |||	 | |
|| | q|   n|t jkr| | d S r   )r   r   r   r<   r   r=   r   r>   r   r?   r   r@   r   rA   r   r   r   rB   rC   r   r   rj   r   r   r   rD   r   r   iterrE   r   )rW   r   r   r   e_typeZt_specZval_lenZe_valr   r   r   r   rH   r   r   r   r     sR    











zTCompactProtocol._write_valc           	      C   s  |t jkrd S |t jkr$|   n|t jkr:|   np|t jt jt jfkr`t	t
| j nJ|t jkrv|   n4|t jkr|   n|t jkr|   n|t jkr|  }|  \}}}|t jkrq| | |   q|   n|t jkr4|  \}}}t|D ]}| | | | q|   nv|t jkrp|  \}}t|D ]}| | qT|   n:|t jkr|  \}}t|D ]}| | q|   d S rF   )r   r9   r   r   r<   r   r=   r>   r?   r   r0   r&   r@   r   rA   r   r   rd   rE   rs   rp   r   rq   rv   rD   r|   r   r~   rC   r}   rB   )	rW   r   rh   idr{   rz   rx   r   r   r   r   r   r     sL    













zTCompactProtocol.skip)TF)N)N)7r6   r7   r8   __doc__r_   rc   rb   Z	TYPE_MASKra   r`   rP   r[   r]   ri   rm   rp   rq   rs   rv   r|   r}   r~   r   r^   r   r   r   rd   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rK   u   sh   
		
G	
<rK   c                   @   s   e Zd ZdddZdd ZdS )	TCompactProtocolFactoryTFc                 C   s   || _ || _d S rF   rU   rV   )rW   rU   rV   r   r   r   rP   I  s    z TCompactProtocolFactory.__init__c                 C   s   t || j| jdS )Nr   )rK   rU   rV   )rW   r&   r   r   r   get_protocolM  s    z$TCompactProtocolFactory.get_protocolN)TF)r6   r7   r8   rP   r   r   r   r   r   r   H  s   
r   )5
__future__r   r#   r   structr   r   r   Zthriftr   r   baser	   excr
   ZCLEARZFIELD_WRITEZVALUE_WRITEZCONTAINER_WRITEZ
BOOL_WRITEZ
FIELD_READZCONTAINER_READZ
VALUE_READZ	BOOL_READr   rA   r   r   r   r   r)   r0   objectr1   r9   r   r:   r<   r=   r>   r?   r@   rE   rB   rC   rD   r   dictitemsrY   r;   rK   r   r   r   r   r   <module>   sr                   V