U
    dRfZ                     @   s   d dl mZ d dlZd dlZd dlZd dlZd dlmZ d dlZd dl	m
Z
 ddlmZ ddlmZ dZdd	 Zdd
dZdddZdd Zdd Zdd Zdd Zdd Zdd ZG dd deZG dd deZdS )     )absolute_importNwarn)TType   )TProtocolBase)TProtocolExceptionc                 C   s2   t | tjr"tjd dkr"|  } t| dS )Nr      ascii)	
isinstancesixstring_typessysversion_infoencodebase64	b64encodedecode)data r   ;/tmp/pip-unpacked-wheel-jqs7l_7o/thriftpy2/protocol/json.pyencode_binary   s    r   c                 C   s   t jt|fft jt|fft jt|fft jt|fft jt|fft jt	|fft j
t|fft jt|fft jt||fft jt||fft jt||fft jt|ffi}|| \}}|r|| S d S N)r   BYTEintI16I32I64DOUBLEfloatSTRINGstrBOOLboolSTRUCTstruct_to_jsonSETlist_to_jsonLISTMAPmap_to_jsonBINARYr   get)ttypevalspecZTTYPE_TO_JSONFUNC_MAPfuncargsr   r   r   
json_value   s8             
 
 
 r2   c                 C   s   | t jkrt|| S t jt|fft jt|fft jt|fft jt|fft jt	|fft j
t|fft jt|fft jt||fft jt||fft jt||fft jtj|ffi}|| \}}|r|| S d S r   )r   r$   struct_to_objr   r   r   r   r   r   r   r    r!   r"   r#   r&   list_to_objr(   r)   
map_to_objr+   r   	b64decoder,   )r-   r.   r/   ZTTYPE_TO_OBJFUNC_MAPr0   r1   r   r   r   	obj_value/   s8    
        
 
 
 
r7   c                 C   s   i }t |d tr"|d d  }}n|d \}}t |d trL|d d  }}n|d \}}| D ]$}t||d ||t||d |< q\|S )Nr   r   valuekey)r   r   r7   )r.   r/   reskey_typekey_spec
value_type
value_specvr   r   r   r5   I   s      r5   c           	      C   s   g }t |d tr |d }d }n|d \}}t |d trH|d }d }n|d \}}|  D ](\}}|t|||t|||d q\|S )Nr   r   )r9   r8   )r   r   itemsappendr2   )	r.   r/   r:   r;   r<   r=   r>   kr?   r   r   r   r*   \   s    

r*   c                    s2   t |tr|\ n
|d    fdd| D S )Nc                    s   g | ]}t  |qS r   )r7   .0iZ	elem_typeZ	type_specr   r   
<listcomp>w   s     zlist_to_obj.<locals>.<listcomp>r   tupler.   r/   r   rF   r   r4   q   s    


r4   c                    s2   t |tr|\ n
|d    fdd| D S )Nc                    s   g | ]}t  |qS r   )r2   rC   rF   r   r   rG      s     z list_to_json.<locals>.<listcomp>rH   rJ   r   rF   r   r'   z   s    


r'   c                 C   sj   i }| j  D ]V\}}|d d \}}t|dkr8d }n|d }t| |}|d krTqt|||||< q|S Nr	      )thrift_specr@   lengetattrr2   )r.   Zoutobjfid
field_spec
field_type
field_namefield_type_specr?   r   r   r   r%      s    
r%   c                 C   sb   |j  D ]R\}}|d d \}}t|dkr4d }n|d }|| kr
t||t|| | | q
|S rK   )rM   r@   rN   setattrr7   )r.   objrP   rQ   rR   rS   rT   r   r   r   r3      s    r3   c                   @   s`   e Zd Z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S )TJSONProtocolaJ  A JSON protocol.

    The message in the transport are encoded as this: 4 bytes represents
    the length of the json object and immediately followed by the json object.

        '   +' '{"payload": {}, "metadata": {"version": 1}}'

    the 4 bytes are the bytes representation of an integer and is encoded in
    big-endian.
    c                 C   s    t | | dti| _d | _d S )Nversion)r   __init__VERSION_meta_dataselftransr   r   r   rY      s    
zTJSONProtocol.__init__c                 C   s   | j tdt| d S )N!I)r_   writestructpackr   )r^   xr   r   r   
_write_len   s    zTJSONProtocol._write_lenc                 C   s   | j d}td|d S )N   r`   r   )r_   readrb   unpack)r^   lr   r   r   	_read_len   s    zTJSONProtocol._read_lenc                 C   sj   |   }t| j|d| _| jd }t|d }|tkrTt	t	j
d|d|d |d |d fS )	Nutf-8metadatarX   z$Bad version in read_message_begin:{})typemessagenamer-   seqid)rj   jsonloadsr_   rg   r   r\   r   rZ   r   ZBAD_VERSIONformat)r^   sizerl   rX   r   r   r   read_message_begin   s    
z TJSONProtocol.read_message_beginc                 C   s   d S r   r   r^   r   r   r   read_message_end   s    zTJSONProtocol.read_message_endc                 C   s   | j |||d d S )N)ro   r-   rp   )r[   update)r^   ro   r-   rp   r   r   r   write_message_begin   s    z!TJSONProtocol.write_message_beginc                 C   s   d S r   r   rv   r   r   r   write_message_end   s    zTJSONProtocol.write_message_endc                 C   sB   | j s(|  }t| j|d| _ t| j d |}d | _ |S )Nrk   payload)r\   rj   rq   rr   r_   rg   r   r3   )r^   rV   rt   r:   r   r   r   read_struct   s    zTJSONProtocol.read_structc                 C   s:   t | jt|d}| t| | j|d d S )N)rl   r{   rk   )	rq   dumpsr[   r%   re   rN   r_   ra   r   )r^   rV   r   r   r   r   write_struct   s    zTJSONProtocol.write_structc                 C   s   t d d S )Nz1TJsonProtocol doesn't support skipping. Ignoring.r   )r^   r-   r   r   r   skip   s    zTJSONProtocol.skipN)__name__
__module____qualname____doc__rY   re   rj   ru   rw   ry   rz   r|   r~   r   r   r   r   r   rW      s   		rW   c                   @   s   e Zd Zdd ZdS )TJSONProtocolFactoryc                 C   s   t |S r   )rW   r]   r   r   r   get_protocol   s    z!TJSONProtocolFactory.get_protocolN)r   r   r   r   r   r   r   r   r      s   r   )N)N)
__future__r   r   rq   rb   r   warningsr   r   Zthriftpy2.thriftr   baser   excr   rZ   r   r2   r7   r5   r*   r4   r'   r%   r3   rW   objectr   r   r   r   r   <module>   s*   

		D