a
    /3e                     @   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ejeef dddZedddZ	dS )	CallbackDataFilterz"
    Filter for CallbackData.
    )configc                 C   s   || _ || _d S )N)r   factory)selfr   r    r   H/home/pi/bot/my_env/lib/python3.9/site-packages/telebot/callback_data.py__init__(   s    zCallbackDataFilter.__init__returnc                 C   s|   z| j |j}W n ty&   Y dS 0 | j D ]D\}}t|ttt	t
frb|||vrv dS q2|||kr2 dS q2d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                   @   sZ   e Zd ZdZddedddZeddd	Zeejeef d
ddZ	e
d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 rBt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 ]x}||d}|du rN|r>|d}ntd|d|durht|tsht|}| j|v rtd| jd|| q|s|rt	d| j
|}t| dkrt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.new)r2   r
   c                 C   s\   | | j^}}|| jkr$tdn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   r2   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   r3   r   r   r   r   r:   r   r   r   r   r!   E   s
   &r!   )r   r   r   r!   r   r   r   r   <module>   s   "