o
    HEDi                     @   s   d Z ddlmZ dZG dd dZG dd deZ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dZdS )a  
Example:
    >>> from aiogram.utils.helper import Helper, ListItem, HelperMode, Item
    >>> class MyHelper(Helper):
    ...     mode = HelperMode.lowerCamelCase
    ...     FOO_ITEM = ListItem()
    ...     BAR_ITEM = ListItem()
    ...     BAZ_ITEM = ListItem()
    ...     LOREM = Item()
    ...
    >>> print(MyHelper.FOO_ITEM & MyHelper.BAR_ITEM)
    <<<  ['fooItem', 'barItem']
    >>> print(MyHelper.all())
    <<<  ['barItem', 'bazItem', 'fooItem', 'lorem']
    )List_props_keysc                   @   s   e Zd ZdZedd ZdS )Helper c                 C   sN   g }t | D ]}| sqt| |}t|tr||d  q|| q|S )z6
        Get all consts
        :return: list
        r   )dirisuppergetattr
isinstance	ItemsListappendclsresultnamevalue r   c/var/www/www-root/data/www/ovozai.pdev.uz/venv/lib/python3.10/site-packages/aiogram/utils/helper.pyall   s   

z
Helper.allN)__name__
__module____qualname__modeclassmethodr   r   r   r   r   r      s    r   c                   @   sb   e Zd ZdZdZdZdZdZdZe	dd Z
e	d	d
 Ze	dd Ze	dddZe	dd ZdS )
HelperModeoriginalSCREAMING_SNAKE_CASElowerCamelCase	CamelCase
snake_case	lowercasec                 C   s   | j | j| j| j| jgS N)r   r   r   r   r   )r   r   r   r   r   3   s   zHelperMode.allc                 C   sP   |  r|S d}t|D ]\}}|  r|dkr|d| 7 }q|| 7 }q|S )z_
        Transform text to SCREAMING_SNAKE_CASE

        :param text:
        :return:
        r   r   _)r   	enumerateupper)r   textr   possymbolr   r   r   _screaming_snake_case=   s   z HelperMode._screaming_snake_casec                 C   s   |  r|S | | S )zu
        Transform text to snake case (Based on SCREAMING_SNAKE_CASE)

        :param text:
        :return:
        )islowerr'   lower)r   r$   r   r   r   _snake_caseO   s   zHelperMode._snake_caseFc                 C   sl   d}d}t |D ]\}}|dkr|dkrd}q||r| n| 7 }d}q|r4|d  |dd  }|S )z
        Transform text to camelCase or CamelCase

        :param text:
        :param first_upper: first symbol must be upper?
        :return:
        r   Fr!   r   T   N)r"   r#   r)   )r   r$   first_upperr   
need_upperr%   r&   r   r   r   _camel_case[   s   	zHelperMode._camel_casec                 C   s   || j kr
| |S || jkr| |S || jkr"| |ddS || jkr,| |S || jkr7| |dS t	|r?||S |S )za
        Apply mode for text

        :param text:
        :param mode:
        :return:
        r!   r   T)
r   r'   r   r*   r   replacer   r.   r   callable)r   r$   r   r   r   r   applyp   s   
	






zHelperMode.applyN)F)r   r   r   r   r   r   r   r   r   r   r   r'   r*   r.   r1   r   r   r   r   r   *   s"    
	

r   c                   @   s*   e Zd ZdZd	ddZdd Zdd ZdS )
Itemzx
    Helper item

    If a value is not provided,
    it will be automatically generated based on a variable's name
    Nc                 C   s
   || _ d S r    _value)selfr   r   r   r   __init__      
zItem.__init__c                 C      | j S r    r3   r5   instanceownerr   r   r   __get__   s   zItem.__get__c                 C   s@   |  std| jst|drt|t|d| _d S d S d S )Nz*Name for helper item must be in uppercase!r   )r   	NameErrorr4   hasattrr   r1   r   )r5   r;   r   r   r   r   __set_name__   s   
zItem.__set_name__r    )r   r   r   __doc__r6   r<   r?   r   r   r   r   r2      s
    
r2   c                   @   s@   e Zd ZdZdd Zdd Zdd Ze Z Z Z	 Z
 ZZdS )	ListItemzT
    This item is always a list

    You can use &, | and + operators for that.
    c                 C   s   | | S r    r   r5   otherr   r   r   add   s   zListItem.addc                 C   s
   t | jS r    )r
   r4   r9   r   r   r   r<      r7   zListItem.__get__c                 C   r8   r    r3   )r5   itemr   r   r   __getitem__   s   zListItem.__getitem__N)r   r   r   r@   rD   r<   rF   __iadd____add____rand____and____ror____or__r   r   r   r   rA      s    rA   c                       s@   e Zd ZdZ fddZdd Ze Z Z Z Z	 Z
Z  ZS )r
   zn
    Patch for default list

    This class provides +, &, |, +=, &=, |= operators for extending the list
    c                    s   t t| tt| d S r    )superr
   r6   mapstr)r5   seq	__class__r   r   r6      s   zItemsList.__init__c                 C   s   |  | | S r    )extendrB   r   r   r   rD      s   
zItemsList.add)r   r   r   r@   r6   rD   rG   rH   rI   rJ   rK   rL   __classcell__r   r   rQ   r   r
      s
     r
   c                       s   e Zd Z fddZ  ZS )OrderedHelperMetac                    s>   t  | |||}dd dd | D D }t|t| |S )Nc                 S   s   g | ]}|qS r   r   ).0	prop_namer   r   r   
<listcomp>   s    z-OrderedHelperMeta.__new__.<locals>.<listcomp>c                 s   s&    | ]\}}t |ttfr|V  qd S r    )r	   r2   rA   )rV   r   propr   r   r   	<genexpr>   s    
z,OrderedHelperMeta.__new__.<locals>.<genexpr>)rM   __new__itemssetattrPROPS_KEYS_ATTR_NAME)mcsr   bases	namespacekwargsr   
props_keysrQ   r   r   r[      s   	zOrderedHelperMeta.__new__)r   r   r   r[   rT   r   r   rQ   r   rU      s    rU   c                   @   s&   e Zd ZdZedee fddZdS )OrderedHelperr   returnc                 C   sH   g }t | tg D ]}t | |}t|tr||d  q|| q|S )z&
        Get all Items values
        r   )r   r^   r	   r
   r   r   r   r   r   r      s   

zOrderedHelper.allN)r   r   r   r   r   r   rO   r   r   r   r   r   rd      s    rd   )	metaclassN)r@   typingr   r^   r   r   r2   rA   listr
   typerU   rd   r   r   r   r   <module>   s    ^