o
    Fhg                     @   s   d dl mZmZ d dlmZ d dlmZ d dlmZm	Z	m
Z
mZmZmZmZmZ d dlmZ eeeef  ZdZeddG d	d
 d
ZG dd deZG dd deZG dd deZG dd deZdS )    )ABCabstractmethod)asynccontextmanager)	dataclass)AnyAsyncGeneratorDictLiteralMappingOptionalUnionoverload)StatedefaultT)frozenc                   @   sR   e Zd ZU eed< eed< eed< dZee ed< dZee ed< e	Z
eed< dS )
StorageKeybot_idchat_iduser_idN	thread_idbusiness_connection_iddestiny)__name__
__module____qualname__int__annotations__r   r   r   strDEFAULT_DESTINYr    r   r   K/var/www/html/venv/lib/python3.10/site-packages/aiogram/fsm/storage/base.pyr      s   
 r   c                   @   s6   e Zd ZdZe	d	dedeed  defddZ	dS )

KeyBuilderzBase class for key builder.Nkeypartdatastatelockreturnc                 C   s   dS )z
        Build key to be used in storage's db queries

        :param key: contextual key
        :param part: part of the record
        :return: key to be used in storage's db queries
        Nr   )selfr"   r#   r   r   r    build#   s   zKeyBuilder.buildN)
r   r   r   __doc__r   r   r   r	   r   r*   r   r   r   r    r!       s    
r!   c                   @   sb   e Zd ZdZdddddddededed	ed
eddfddZ	ddedee	d  defddZ
dS )DefaultKeyBuildera$  
    Simple key builder with default prefix.

    Generates a colon-joined string with prefix, chat_id, user_id,
    optional bot_id, business_connection_id, destiny and field.

    Format:
     :code:`<prefix>:<bot_id?>:<business_connection_id?>:<chat_id>:<user_id>:<destiny?>:<field?>`
    fsm:Fprefix	separatorwith_bot_idwith_business_connection_idwith_destinyr1   r2   r3   r4   r5   r(   Nc                C   s"   || _ || _|| _|| _|| _dS )a  
        :param prefix: prefix for all records
        :param separator: separator
        :param with_bot_id: include Bot id in the key
        :param with_business_connection_id: include business connection id
        :param with_destiny: include destiny key
        Nr0   )r)   r1   r2   r3   r4   r5   r   r   r    __init__>   s
   
zDefaultKeyBuilder.__init__r"   r#   r$   c                 C   s   | j g}| jr|t|j | jr|jr|t|j |t|j |jr0|t|j |t|j	 | j
rB||j n|jtkrMd}t||rT|| | j|S )NzDefault key builder is not configured to use key destiny other than the default.

Probably, you should set `with_destiny=True` in for DefaultKeyBuilder.)r1   r3   appendr   r   r4   r   r   r   r   r5   r   r   
ValueErrorr2   join)r)   r"   r#   partserror_messager   r   r    r*   T   s$   

zDefaultKeyBuilder.buildr+   )r   r   r   r,   r   boolr6   r   r   r	   r*   r   r   r   r    r-   3   s8    

r-   c                
   @   s  e Zd ZdZeddededdfddZededee	 fdd	Z
eded
ee	ef ddfddZededee	ef fddZedede	dee fddZedede	dedefddZ	ddede	dee dee fddZded
ee	ef dee	ef fddZedddZdS )BaseStoragez)
    Base class for all FSM storages
    Nr"   r&   r(   c                       dS )zn
        Set state for specified key

        :param key: storage key
        :param state: new state
        Nr   )r)   r"   r&   r   r   r    	set_statet      zBaseStorage.set_statec                    r>   )z_
        Get key state

        :param key: storage key
        :return: current state
        Nr   r)   r"   r   r   r    	get_state~   r@   zBaseStorage.get_stater%   c                    r>   )ze
        Write data (replace)

        :param key: storage key
        :param data: new data
        Nr   )r)   r"   r%   r   r   r    set_data   r@   zBaseStorage.set_datac                    r>   )zi
        Get current data for key

        :param key: storage key
        :return: current data
        Nr   rA   r   r   r    get_data   r@   zBaseStorage.get_datastorage_keydict_keyc                    r>   )z
        Get single value from data by key

        :param storage_key: storage key
        :param dict_key: value key
        :return: value stored in key of dict or ``None``
        Nr   )r)   rE   rF   r   r   r    	get_value   s   	zBaseStorage.get_valuer   c                    r>   )z
        Get single value from data by key

        :param storage_key: storage key
        :param dict_key: value key
        :param default: default value to return
        :return: value stored in key of dict or default
        Nr   )r)   rE   rF   r   r   r   r    rG      s   
c                    s   |  |I d H }|||S r+   )rD   get)r)   rE   rF   r   r%   r   r   r    rG      s   c                    s:   | j |dI dH }|| | j||dI dH  | S )z
        Update date in the storage for key (like dict.update)

        :param key: storage key
        :param data: partial data
        :return: new data
        )r"   N)r"   r%   )rD   updaterC   copy)r)   r"   r%   current_datar   r   r    update_data   s
   
zBaseStorage.update_datac                    r>   )zC
        Close storage (database connection, file or etc.)
        Nr   r)   r   r   r    close   s   zBaseStorage.closer+   r(   N)r   r   r   r,   r   r   	StateTyper?   r   r   rB   r
   r   rC   r   rD   r   rG   rL   rN   r   r   r   r    r=   o   s6    		 		

&r=   c                   @   s8   e Zd Zeededed fddZed	ddZdS )
BaseEventIsolationr"   r(   )NNc                 C  s   dV  dS )z
        Isolate events with lock.
        Will be used as context manager

        :param key: storage key
        :return: An async generator
        Nr   rA   r   r   r    r'      s   

zBaseEventIsolation.lockNc                    s   d S r+   r   rM   r   r   r    rN      s   zBaseEventIsolation.closerO   )	r   r   r   r   r   r   r   r'   rN   r   r   r   r    rQ      s    
rQ   N)abcr   r   
contextlibr   dataclassesr   typingr   r   r   r	   r
   r   r   r   aiogram.fsm.stater   r   rP   r   r   r!   r-   r=   rQ   r   r   r   r    <module>   s    (	<_