U
    bh                     @  s\  U d Z ddlmZ ddlZddlZddlZddlmZmZmZ ddl	m
Z
 ddlmZmZmZ dZzddlmZ eef7 ZW n ek
r   Y nX G d	d
 d
ejZdddddZejedfddZddddZejdefddZeegef  ZZedZedZdd fdddd d!d"d#Zi Zd$ed%< d&d d'd d(Zd)ed*< d+d, Z e   dS )-zJSON Serialization Utilities.    )annotationsN)datedatetimetime)Decimal)AnyCallableTypeVar )Promisec                      s    e Zd ZdZ fddZ  ZS )JSONEncoderzKombu custom json encoder.c                   s   t |dd }|d k	r| S t|tr,t|S t D ]8\}\}}t||r4|d krZ||nt|||  S q4t|trztd|dW S  t	k
r   tdt
|d Y S X t |S )NZ__json__bytesutf-8base64)getattr
isinstancetextual_typesstr	_encodersitems_asr   decodeUnicodeDecodeErrorr   	b64encodesuperdefault)selfoZreducertmarkerencoder	__class__r
   4/tmp/pip-unpacked-wheel-earovzxb/kombu/utils/json.pyr      s    


zJSONEncoder.default)__name__
__module____qualname____doc__r   __classcell__r
   r
   r!   r#   r      s   r   r   r   r   vc                 C  s
   | |dS )N)__type__	__value__r
   r)   r
   r
   r#   r   2   s    r   c                 K  s$   |pi }|| fd|it |f|S )z Serialize object to json string.cls)dict)s_dumpsr-   Zdefault_kwargskwargsr
   r
   r#   dumps6   s    r2   r.   r   c                 C  sD   |   ddhkr<t| d }|r.|| d S tdt| n| S dS )z0Hook function to perform custom deserialization.r+   r,   zUnsupported typeN)keys	_decodersget
ValueErrortype)r   decoderr
   r
   r#   object_hookB   s    r:   Tc                 C  sT   t | tr|  d} n.t | tr0| d} n|rHt | trH| d} || |dS )zDeserialize json from string.r   )r:   )r   
memoryviewtobytesr   	bytearrayr   )r/   _loadsZdecode_bytesr:   r
   r
   r#   loadsN   s    


r?   TEncodedTc                 C  s   | S Nr
   )dr
   r
   r#   <lambda>i       rD   ztype[T]z
str | NonezCallable[[T], EncodedT]zCallable[[EncodedT], T]r   r   r    r9   c                 C  s    ||ft | < |dk	r|t|< dS )a  Add support for serializing/deserializing native python type.

    If marker is `None`, the encoding is a pure transformation and the result
    is not placed in an envelope, so `decoder` is unnecessary. Decoding must
    instead be handled outside this library.
    N)r   r5   rF   r
   r
   r#   register_typee   s    rG   z'dict[type, tuple[str | None, EncoderT]]r   c                 C  s
   |  dS Nr   )encoder3   r
   r
   r#   rD   x   rE   c                 C  s   t | dS rH   )r   	b64decoderI   r3   r
   r
   r#   rD   y   rE   )r   r   zdict[str, DecoderT]r5   c                   C  sf   t tdtjtj t tddd dd  t tddd tj t tdtt t tj	d	d
d dd  d S )Nr   r   c                 S  s   |   S rB   	isoformatr3   r
   r
   r#   rD      rE   z)_register_default_types.<locals>.<lambda>c                 S  s   t |  S rB   )r   fromisoformatr   r3   r
   r
   r#   rD      rE   r   c                 S  s   |   S rB   rK   r3   r
   r
   r#   rD      rE   decimaluuidc                 S  s
   d| j iS )Nhex)rP   r3   r
   r
   r#   rD      rE   c                 S  s   t jf | S rB   )rO   UUIDr3   r
   r
   r#   rD      rE   )
rG   r   rL   rM   r   r   r   r   rO   rQ   r
   r
   r
   r#   _register_default_types}   s"    
rR   )!r'   
__future__r   r   jsonrO   r   r   r   rN   r   typingr   r   r	   r   Zdjango.utils.functionalr   ImportErrorr   r   r2   r:   r?   ZDecoderTZEncoderTr@   rA   rG   r   __annotations__r5   rR   r
   r
   r
   r#   <module>   s@   
