o
    @Mh                     @   s.   d Z 	 ddlZG dd dZG dd dZdS )z
Callback data factory's file.
    Nc                   @   s6   e Zd ZdZdejeef fddZdefddZ	dS )	CallbackDataFilterz"
    Filter for CallbackData.
    configc                 C   s   || _ || _d S )N)r   factory)selfr   r    r   H/var/www/html/venv/lib/python3.10/site-packages/telebot/callback_data.py__init__(   s   
zCallbackDataFilter.__init__returnc                 C   s|   z	| j |j}W n
 ty   Y dS w | j D ]"\}}t|ttt	t
fr1|||vr0 dS q|||kr; dS qdS )a  
        Checks if query.data appropriates to specified config

        :param query: telebot.types.CallbackQuery
        :type query: telebot.types.CallbackQuery

        :return: True if query.data appropriates to specified config
        :rtype: bool
        FT)r   parsedata
ValueErrorr   items
isinstancelisttupleset	frozensetget)r   queryr   keyvaluer   r   r   check,   s   zCallbackDataFilter.checkN)
__name__
__module____qualname____doc__typingDictstrr   boolr   r   r   r   r   r   #   s    r   c                   @   s\   e Zd ZdZdddefddZdefdd	Zd
edejeef fddZ	de
fddZdS )CallbackDatazW
    Callback data factory
    This class will help you to work with CallbackQuery
    :)sepprefixc                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)	r   r   	TypeErrortyper   r   r#   r"   _part_names)r   r#   r"   partsr   r   r   r   K   s   

zCallbackData.__init__r	   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 )
z
        Generate callback data

        :param args: positional parameters of CallbackData instance parts
        :param kwargs: named parameters
        :return: str
        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!)r   r#   r&   popr   r   r   r"   appendr$   joinlenencode)r   argskwargsr   partr   callback_datar   r   r   newX   s&   

zCallbackData.newr1   c                 C   sZ   | | j^}}|| jkrtdt|t| jkrtdd|i}|t| j| |S )z
        Parse data from the callback data
        
        :param callback_data: string, use to telebot.types.CallbackQuery to parse it from string to a dict
        :return: dict parsed from callback data
        z6Passed callback data can't be parsed with that prefix.zInvalid parts count!@)splitr"   r#   r   r,   r&   updatezip)r   r1   r#   r'   resultr   r   r   r
   ~   s   
zCallbackData.parsec                 K   s0   |  D ]}|| jvrtd|qt| |S )z
        Generate filter

        :param config: specified named parameters will be checked with CallbackQuery.data
        :return: CallbackDataFilter class
        zInvalid field name )keysr&   r   r   )r   r   r   r   r   r   filter   s
   

zCallbackData.filterN)r   r   r   r   r   r   r2   r   r   r
   r   r9   r   r   r   r   r    E   s    &r    )r   r   r   r    r   r   r   r   <module>   s
    "