o
    Ín~b  ã                   @   s$   d dl mZmZ G dd„ deƒZdS )é    )Úunpack_fromÚcalcsizec                   @   sH   e Zd Zdd„ Zdd„ Zdd„ Zddd	„Zddd„Zdd„ Zdd„ Z	dS )ÚStructReaderc                 C   s"   t |tƒs	tdƒ‚|| _d| _dS )zzSimplifies parsing of struct data from bytes

        :param data: data bytes
        :type  data: :class:`bytes`
        zOnly works with bytesr   N)Ú
isinstanceÚbytesÚ
ValueErrorÚdataÚoffset)Úselfr   © r   ú=/usr/local/lib/python3.10/dist-packages/steam/utils/binary.pyÚ__init__   s   

zStructReader.__init__c                 C   s
   t | jƒS )N)Úlenr   ©r
   r   r   r   Ú__len__   s   
zStructReader.__len__c                 C   s   t dt| ƒ| j ƒS )z|Number of remaining bytes that can be read

        :return: number of remaining bytes
        :rtype: :class:`int`
        r   )Úmaxr   r	   r   r   r   r   Úrlen   s   zStructReader.rlené   c                 C   s$   |  j |7  _ | j| j | | j … S )z™Return n bytes

        :param n: number of bytes to return
        :type  n: :class:`int`
        :return: bytes
        :rtype: :class:`bytes`
        )r	   r   ©r
   Únr   r   r   Úread   s   zStructReader.readó    c                 C   sB   | j  || j¡}|dkrtdƒ‚| j | j|… }|t|ƒ | _|S )ztReads a single null termianted string

        :return: string without bytes
        :rtype: :class:`bytes`
        éÿÿÿÿzReached end of buffer)r   Úfindr	   ÚRuntimeErrorr   )r
   Ú
terminatorZ
null_indexÚresultr   r   r   Úread_cstring&   s   zStructReader.read_cstringc                 C   s&   t || j| jƒ}|  jt|ƒ7  _|S )zêUnpack bytes using struct modules format

        :param format_text: struct's module format
        :type  format_text: :class:`str`
        :return data: result from :func:`struct.unpack_from`
        :rtype: :class:`tuple`
        )Ú_unpack_fromr   r	   Ú	_calcsize)r
   Zformat_textr   r   r   r   Úunpack3   s   zStructReader.unpackc                 C   s   |  j |7  _ dS )zmSkips the next ``n`` bytes

        :param n: number of bytes to skip
        :type  n: :class:`int`
        N)r	   r   r   r   r   Úskip?   s   zStructReader.skipN)r   )r   )
Ú__name__Ú
__module__Ú__qualname__r   r   r   r   r   r    r!   r   r   r   r   r      s    

r   N)Ústructr   r   r   r   Úobjectr   r   r   r   r   Ú<module>   s    