o
    HEDi-  ã                   @  sR   d Z ddlmZ ddlZddlmZ ddlmZ G dd„ dƒZG dd	„ d	eƒZ	dS )
aà  
Callback data factory

Usage:
    Create instance of factory with prefix and element names:
    >>> posts_query = CallbackData('post', 'post_id', 'action')

    Then you can generate callback data:
    >>> posts_query.new('32feff9b-92fa-48d9-9d29-621dc713743a', action='view')
    <<< post:32feff9b-92fa-48d9-9d29-621dc713743a:view

    Also you can generate filters:
    >>> posts_query.filter(action='delete')
    This filter can handle callback data by pattern: post:*:delete
é    )ÚannotationsN)Útypes)ÚFilterc                   @  s<   e Zd ZdZddœdd„Zddd	„Zddd„Zddd„ZdS )ÚCallbackDataz
    Callback data factory
    ú:)Úsepc                G  sX   t |tƒstdt|ƒj› ƒ‚|stdƒ‚||v r!td|›dƒ‚|| _|| _|| _d S )Nz#Prefix must be instance of str not zPrefix can't be emptyz
Separator z can't be used in prefix)	Ú
isinstanceÚstrÚ	TypeErrorÚtypeÚ__name__Ú
ValueErrorÚprefixr   Ú_part_names)Úselfr   r   Úparts© r   új/var/www/www-root/data/www/ovozai.pdev.uz/venv/lib/python3.10/site-packages/aiogram/utils/callback_data.pyÚ__init__   s   

zCallbackData.__init__Úreturnr	   c                 O  sÈ   t |ƒ}| jg}| jD ]<}| |d¡}|du r'|r| d¡}ntd|›dƒ‚|dur4t|tƒs4t|ƒ}| j|v rBtd| j›dƒ‚| |¡ q|sL|rPt	dƒ‚| j 
|¡}t| ¡ ƒdkrbtd	ƒ‚|S )
zf
        Generate callback data

        :param args:
        :param kwargs:
        :return:
        Nr   z
Value for z was not passed!zSymbol z? is defined as the separator and can't be used in parts' valueszToo many arguments were passed!é@   z#Resulted callback data is too long!)Úlistr   r   Úpopr   r   r	   r   Úappendr
   ÚjoinÚlenÚencode)r   ÚargsÚkwargsÚdataÚpartÚvalueÚcallback_datar   r   r   Únew*   s&   

zCallbackData.newr"   útyping.Dict[str, str]c                 C  sZ   |  | j¡^}}|| jkrtdƒ‚t|ƒt| jƒkrtdƒ‚d|i}| t| j|ƒ¡ |S )zc
        Parse data from the callback data

        :param callback_data:
        :return:
        z6Passed callback data can't be parsed with that prefix.zInvalid parts count!ú@)Úsplitr   r   r   r   r   ÚupdateÚzip)r   r"   r   r   Úresultr   r   r   ÚparseO   s   
zCallbackData.parseÚCallbackDataFilterc                 K  s0   |  ¡ D ]}|| jvrtd|›ƒ‚qt| |ƒS )zJ
        Generate filter

        :param config:
        :return:
        zInvalid field name )Úkeysr   r   r+   )r   ÚconfigÚkeyr   r   r   Úfilter`   s
   
ÿ
zCallbackData.filterN)r   r	   )r"   r	   r   r$   )r   r+   )r   Ú
__module__Ú__qualname__Ú__doc__r   r#   r*   r/   r   r   r   r   r      s    

%r   c                   @  s.   e Zd Zddd„Zedd	d
„ƒZddd„ZdS )r+   Úfactoryr   r-   r$   c                 C  s   || _ || _d S )N)r-   r3   )r   r3   r-   r   r   r   r   o   s   
zCallbackDataFilter.__init__Úfull_configútyping.Dict[str, typing.Any]c                 C  s   t dƒ‚)Nz-That filter can't be used in filters factory!)r   )Úclsr4   r   r   r   Úvalidates   s   zCallbackDataFilter.validateÚqueryútypes.CallbackQueryc                 Ã  s‚   z	| j  |j¡}W n
 ty   Y dS w | j ¡ D ]"\}}t|ttt	t
fƒr2| |¡|vr1 dS q| |¡|kr< dS qd|iS )NFr"   )r3   r*   r   r   r-   Úitemsr   r   ÚtupleÚsetÚ	frozensetÚget)r   r8   r   r.   r!   r   r   r   Úcheckw   s   €ÿÿÿzCallbackDataFilter.checkN)r3   r   r-   r$   )r4   r5   )r8   r9   )r   r0   r1   r   Úclassmethodr7   r?   r   r   r   r   r+   m   s
    
r+   )
r2   Ú
__future__r   ÚtypingÚaiogramr   Úaiogram.dispatcher.filtersr   r   r+   r   r   r   r   Ú<module>   s    U