U
    g                     @   s   d dl Z d dlZd dlZd dlmZmZmZmZmZ ej	j
dkrZej	jdkrZd dl mZ nd dlmZ ddlmZmZmZ ddlmZ dd	lmZ d
dlmZmZ d
dlmZmZmZmZ e ZG dd deddZG dd deZG dd deZ dS )    N)CallableListOptional	TypedDictUnion      )timeout   )ConnectionErrorInvalidResponse
RedisError)
EncodableT)HIREDIS_AVAILABLE   )AsyncBaseParser
BaseParser)#NONBLOCKING_EXCEPTION_ERROR_NUMBERSNONBLOCKING_EXCEPTIONSSENTINELSERVER_CLOSED_CONNECTION_ERRORc                   @   sJ   e Zd ZU eegef ed< eegef ed< ee ed< ee ed< dS )_HiredisReaderArgsprotocolError
replyErrorencodingerrorsN)__name__
__module____qualname__r   str	Exception__annotations__r    r"   r"   :/tmp/pip-unpacked-wheel-f3sx1i9r/redis/_parsers/hiredis.pyr      s   
r   F)totalc                   @   sP   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d Ze	dfddZ
dddZdS )_HiredisParserz*Parser class for connections using Hiredisc                 C   s    t std|| _t|| _d S )NzHiredis is not installed)r   r   socket_read_size	bytearray_bufferselfr&   r"   r"   r#   __init__&   s    z_HiredisParser.__init__c                 C   s&   z|    W n tk
r    Y nX d S N)on_disconnectr    r*   r"   r"   r#   __del__,   s    z_HiredisParser.__del__c                 K   sX   dd l }|j| _|j| _t| j|jjtd}|jj	r@|jj
|d< |jf || _t| _d S )Nr   )r   r   r   notEnoughDatar   )hiredis_socksocket_timeout_socket_timeoutr   parse_errorencoderencoding_errorsNOT_ENOUGH_DATAdecode_responsesr   Reader_reader_next_response)r*   
connectionkwargsr1   r"   r"   r#   
on_connect2   s    z_HiredisParser.on_connectc                 C   s   d | _ d | _t| _d S r,   )r2   r;   r8   r<   r.   r"   r"   r#   r-   C   s    z_HiredisParser.on_disconnectc                 C   s@   | j stt| jtkr<| j  | _| jtkr<| j|ddS dS )NF)r	   raise_on_timeoutT)r;   r   r   r<   r8   getsread_from_socket)r*   r	   r"   r"   r#   can_readH   s    

z_HiredisParser.can_readTc              
   C   s   | j }|tk	}zzH|r || | j | j}|dkr>tt| j	| jd| W W dS  t
jk
r   |rvtdY W ddS  tk
r } z>t|jd}|s|j|krW Y W *dS td|j W 5 d }~X Y nX W 5 |r|| j X d S )Nr   TzTimeout reading from socketFz!Error while reading from socket: )r2   r   
settimeoutr4   	recv_intor(   r   r   r;   feedsocketr	   TimeoutErrorr   r   get	__class__errnoargs)r*   r	   r@   sockZcustom_timeoutZbufflenexallowedr"   r"   r#   rB   R   s*    


&z_HiredisParser.read_from_socketFc                 C   s   | j stt| jtk	r(| j}t| _|S |r:| j d}n
| j  }|tkrr|   |rf| j d}qD| j  }qDt|tr|n$t|tr|rt|d tr|d |S NFr   )	r;   r   r   r<   r8   rA   rB   
isinstancelistr*   disable_decodingresponser"   r"   r#   read_responsep   s0    


z_HiredisParser.read_responseN)F)r   r   r   __doc__r+   r/   r?   r-   rC   r   rB   rW   r"   r"   r"   r#   r%   #   s   
r%   c                       sh   e Zd ZdZdZed fddZdd Zdd	 Zd
d Z	dd Z
deeeee f dddZ  ZS )_AsyncHiredisParserzBAsync implementation of parser class for connections using Hiredis)r;   r&   c                    s$   t stdt j|d d | _d S )NzHiredis is not available.rZ   )r   r   superr+   r;   r)   rK   r"   r#   r+      s    z_AsyncHiredisParser.__init__c                 C   sV   dd l }|j| _t| jtd}|jjr>|jj|d< |jj	|d< |j
f || _d| _d S )Nr   )r   r   r0   r   r   T)r1   r;   _streamr   r5   r8   r6   r9   r   r7   r:   
_connected)r*   r=   r1   r>   r"   r"   r#   r?      s    z_AsyncHiredisParser.on_connectc                 C   s
   d| _ d S )NF)r^   r.   r"   r"   r#   r-      s    z!_AsyncHiredisParser.on_disconnectc                    s   | j stt| j tk	r dS zDtd4 I d H $ |  I d H W  5 Q I d H R  W S Q I d H R X W n tj	k
r|   Y dS X d S )NTr   F)
r^   r   r   r;   rA   r8   async_timeoutrB   asynciorI   r.   r"   r"   r#   can_read_destructive   s    2z(_AsyncHiredisParser.can_read_destructivec                    s<   | j | jI d H }|r"t|ts,ttd | j| dS )NT)	r]   read
_read_sizerR   bytesr   r   r;   rG   )r*   bufferr"   r"   r#   rB      s
    
z$_AsyncHiredisParser.read_from_socketF)rU   returnc                    s   | j sttd |r"| jd}n
| j }|tkr`|  I d H  |rT| jd}q,| j }q,t|trp|n$t|tr|rt|d tr|d |S rQ   )	r^   r   r   r;   rA   r8   rB   rR   rS   rT   r"   r"   r#   rW      s(    


z!_AsyncHiredisParser.read_response)F)r   r   r   rX   	__slots__intr+   r?   r-   ra   rB   boolr   r   r   rW   __classcell__r"   r"   r\   r#   rY      s   
 rY   )!r`   rH   systypingr   r   r   r   r   version_infomajorminorr	   r_   
exceptionsr   r   r   r   utilsr   baser   r   r   r   r   r   objectr8   r   r%   rY   r"   r"   r"   r#   <module>   s   
p