
    AHj                    J    d Z ddlmZ ddlmZmZ  G d de      Zd	dZd
dZ	y)a  
An encoding / decoding format suitable for serializing data structures to binary.

This is based on https://en.wikipedia.org/wiki/Bencode with some extensions.

The following data types may be encoded:

- None
- int
- bool
- bytes
- str
- list
- tuple
- dict

    )annotations)AnyCallablec                      e Zd ZdZy)DecodeErrorzA problem decoding data.N)__name__
__module____qualname____doc__     N/root/tools/cai/cai_env/lib/python3.12/site-packages/textual/_binary_encode.pyr   r      s    "r   r   c                   	
 dd}dd}dd}dd}dd}d
fd}d
fd}d
fd}t        d	      |t        |t        |t        |t        |t
        |t        |t        |i	d	fd

 
|       S )zEncodes a data structure into bytes.

    Args:
        data: Data structure

    Returns:
        A byte string encoding the data.
    c                     y)z
        Encodes a None value.

        Args:
            datum: Always None.

        Returns:
            None encoded.
           Nr   )_datums    r   encode_nonezdump.<locals>.encode_none&   s     r   c                    | rdS dS )z
        Encode a boolean value.

        Args:
            datum: The boolean value to encode.

        Returns:
            The encoded bytes.
           T   Fr   datums    r   encode_boolzdump.<locals>.encode_bool2   s     t&$&r   c                    d| z  S )z
        Encode an integer value.

        Args:
            datum: The integer value to encode.

        Returns:
            The encoded bytes.
        s   i%ier   r   s    r   
encode_intzdump.<locals>.encode_int>   s     r   c                "    dt        |       | fz  S )z
        Encode a bytes value.

        Args:
            datum: The bytes value to encode.

        Returns:
            The encoded bytes.
        s   %i:%s)lenr   s    r   encode_byteszdump.<locals>.encode_bytesJ   s     3u:u---r   c                D    | j                  d      }dt        |      |fz  S )z
        Encode a string value.

        Args:
            datum: The string value to encode.

        Returns:
            The encoded bytes.
        utf-8s   s%i:%s)encoder   )r   encoded_datas     r   encode_stringzdump.<locals>.encode_stringV   s'     ||G,C-|<<<r   c                >    ddj                  fd| D              z  S )z
        Encode a list value.

        Args:
            datum: The list value to encode.

        Returns:
            The encoded bytes.
        s   l%ser   c              3  .   K   | ]  } |        y wNr   .0elementr!   s     r   	<genexpr>z,dump.<locals>.encode_list.<locals>.<genexpr>m        !Gg&/!G   joinr   r!   s    r   encode_listzdump.<locals>.encode_listc        !G!GGGGr   c                >    ddj                  fd| D              z  S )z
        Encode a tuple value.

        Args:
            datum: The tuple value to encode.

        Returns:
            The encoded bytes.
        s   t%ser   c              3  .   K   | ]  } |        y wr&   r   r'   s     r   r*   z-dump.<locals>.encode_tuple.<locals>.<genexpr>y   r+   r,   r-   r/   s    r   encode_tuplezdump.<locals>.encode_tupleo   r1   r   c                Z    ddj                  fd| j                         D              z  S )z
        Encode a dictionary value.

        Args:
            datum: The dictionary value to encode.

        Returns:
            The encoded bytes.
        s   d%ser   c              3  J   K   | ]  \  }}d  |       |      fz    yw)s   %s%sNr   )r(   keyvaluer!   s      r   r*   z,dump.<locals>.encode_dict.<locals>.<genexpr>   s,      "
7AsEGvc{F5M22"
s    #)r.   itemsr/   s    r   encode_dictzdump.<locals>.encode_dict{   s0      "
EJ[[]"
 
 
 	
r   Nc                d    	 t        |          } ||       S # t        $ r t        d      dw xY w)zRecursively encode data.

        Args:
            datum: Data suitable for encoding.

        Raises:
            TypeError: If `datum` is not one of the supported types.

        Returns:
            Encoded data bytes.
        zCan't encode {datum!r}N)typeKeyError	TypeError)r   decoderENCODERSs     r   r!   zdump.<locals>.encode   sD    	@tE{+G u~  	@454?	@s    /)r   Nonereturnbytes)r   boolrB   rC   )r   intrB   rC   )r   rC   rB   rC   )r   strrB   rC   )r   listrB   rC   )r   tuplerB   rC   )r   dictrB   rC   )r   objectrB   rC   )r<   rD   rE   rC   rF   rG   rH   rI   )datar   r   r   r   r#   r0   r4   r:   r@   r!   s            @@r   dumprL      ss    

'

.=
H
H
 	T
KkZ|]k|k	2H$ $<r   c           	     "   	
 t         t              st        d      t               dd fd	d fdd fd
d	fd}d	
fdd	
fd}d	fd	}d	fd
}d	fd}|||||d d d dd	fd        S )zLoad an encoded data structure from bytes.

    Args:
        encoded: Encoded data in bytes.

    Raises:
        DecodeError: If an error was encountered decoding the string.

    Returns:
        Decoded data.
    zmust be bytesr   c                 B    k\  rt        d      dz    } dz  | S )zGet an encoded byte and advance position.

        Raises:
            DecodeError: If the end of the data was reached

        Returns:
            A bytes object with a single byte.
        zMore data expected   )r   )	characterencodedmax_positionpositions    r   get_bytezload.<locals>.get_byte   s8     |#233Hx!|4	Ar   c                      dz    S )zGet the byte at the current position, but don't advance position.

        Returns:
            A bytes object with a single byte.
        rO   r   )rQ   rS   s   r   	peek_bytezload.<locals>.peek_byte   s     x(Q,//r   c                T    | z    }t        |      | k7  rt        d      | z  |S )zGet a number of bytes of encode data.

        Args:
            size: Number of bytes to retrieve.

        Raises:
            DecodeError: If there aren't enough bytes.

        Returns:
            A bytes object.
        s   Missing bytes in {bytes_data!r})r   r   )size
bytes_datarQ   rS   s     r   	get_byteszload.<locals>.get_bytes   s=     X48
z?d"@AADr   c                 Z    d}         x}dk7  r| |z  }         x}dk7  rt        |       S )zWDecode an int from the encoded data.

        Returns:
            An integer.
        r      erE   )	int_bytesbyterT   s     r   
decode_intzload.<locals>.decode_int   s>     	z!td*I  z!td*9~r   c                f            x}dk7  r| |z  }         x}dk7  r t        |             }|S )zcDecode a bytes string from the encoded data.

        Returns:
            A bytes object.
           :r]   )
size_bytesr_   bytes_stringrT   rZ   s      r   decode_byteszload.<locals>.decode_bytes   sC      z!td*$J  z!td* Z1r   c                     d}         x}dk7  r| |z  }         x}dk7  r t        |             }|j                  dd      }|S )zgDecode a (utf-8 encoded) string from the encoded data.

        Returns:
            A string.
        r   rb   r    replace)errors)rE   decode)rc   r_   rd   decoded_stringrT   rZ   s       r   decode_stringzload.<locals>.decode_string   s]     
z!td*$J  z!td* Z1%,,WY,Gr   c                 v    g } | j                   }        dk7  r |                       dk7  r         | S )zEDecode a list.

        Returns:
            A list of data.
        r\   )appendelementsadd_elementri   rT   rV   s     r   decode_listzload.<locals>.decode_list  s=     "$ookT!! kT!
r   c                     g } | j                   }        dk7  r |                       dk7  r         t        |       S )zODecode a tuple.

        Returns:
            A tuple of decoded data.
        r\   )rm   rH   rn   s     r   decode_tuplezload.<locals>.decode_tuple  sB     "$ookT!! kT!
Xr   c                     i } | j                   }        dk7  r |                               dk7  r         | S )zMDecode a dict.

        Returns:
            A dict of decoded data.
        r\   )__setitem__rn   s     r   decode_dictzload.<locals>.decode_dict"  sC     *,**kT!&(+ kT!
r   c                      y)NTr   r   r   r   <lambda>zload.<locals>.<lambda>5      r   c                      y)NFr   r   r   r   rx   zload.<locals>.<lambda>6  ry   r   c                      y r&   r   r   r   r   rx   zload.<locals>.<lambda>7  ry   r   )   i   s   l   t   dr   r   r   c                 X    j                          x} d      }| |       S  |       S )zMRecursively decode data.

        Returns:
            Decoded data.
        N)get)initialr?   DECODERSre   rT   s     r   ri   zload.<locals>.decode:  s4     ,,(*4wd;?((yr   )rB   rC   )rX   rE   rB   rC   )rB   rE   )rc   rC   rB   rC   )rB   rF   )rB   zlist[object])rB   ztuple[object, ...])rB   zdict[object, object])rB   rJ   )
isinstancerC   r>   r   )rQ   r`   rk   rq   rs   rv   r   ri   re   rT   rZ   rR   rV   rS   s   `     @@@@@@@@r   loadr      s     gu%((w<LH 0&		 	H	 8Or   N)rK   rJ   rB   rC   )rQ   rC   rB   rJ   )
r   
__future__r   typingr   r   	Exceptionr   rL   r   r   r   r   <module>r      s+   $ #  #) #JZ\r   