U
    -e                     @  s   d Z ddlmZ ddlmZmZ ddlmZ ddlm	Z	 ddl
mZ ddlmZmZ d	d
ddddgZG dd
 d
eZG dd de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G dd deZdS )zV
Input validation for a `Buffer`.
(Validators will be called before accepting input.)
    )annotations)ABCMetaabstractmethod)Callablerun_in_executor_with_context   )Document)FilterOrBool	to_filterConditionalValidatorValidationError	ValidatorThreadedValidatorDummyValidatorDynamicValidatorc                      s:   e Zd ZdZddddd fdd	Zdd
ddZ  ZS )r   z
    Error raised by :meth:`.Validator.validate`.

    :param cursor_position: The cursor position where the error occurred.
    :param message: Text.
    r    intstrNone)cursor_positionmessagereturnc                   s   t  | || _|| _d S N)super__init__r   r   )selfr   r   	__class__ Z/var/www/html/Darija-Ai-Train/env/lib/python3.8/site-packages/prompt_toolkit/validation.pyr   !   s    zValidationError.__init__r   c                 C  s   d | jj| j| jS )Nz&{}(cursor_position={!r}, message={!r}))formatr   __name__r   r   r   r   r   r    __repr__&   s
    zValidationError.__repr__)r   r   )r#   
__module____qualname____doc__r   r%   __classcell__r   r   r   r    r      s   c                   @  sN   e Zd ZdZedddddZdddddZeddddd dddZdS )r   a  
    Abstract base class for an input validator.

    A validator is typically created in one of the following two ways:

    - Either by overriding this class and implementing the `validate` method.
    - Or by passing a callable to `Validator.from_callable`.

    If the validation takes some time and needs to happen in a background
    thread, this can be wrapped in a :class:`.ThreadedValidator`.
    r	   r   documentr   c                 C  s   dS )z
        Validate the input.
        If invalid, this should raise a :class:`.ValidationError`.

        :param document: :class:`~prompt_toolkit.document.Document` instance.
        Nr   r   r+   r   r   r    validate;   s    zValidator.validatec                   s*   z|  | W n tk
r$    Y nX dS )z
        Return a `Future` which is set when the validation is ready.
        This function can be overloaded in order to provide an asynchronous
        implementation.
        N)r-   r   r,   r   r   r    validate_asyncE   s    zValidator.validate_asyncInvalid inputFCallable[[str], bool]r   bool)validate_funcerror_messagemove_cursor_to_endr   c                 C  s   t |||S )aF  
        Create a validator from a simple validate callable. E.g.:

        .. code:: python

            def is_valid(text):
                return text in ['hello', 'world']
            Validator.from_callable(is_valid, error_message='Invalid input')

        :param validate_func: Callable that takes the input string, and returns
            `True` if the input is valid input.
        :param error_message: Message to be displayed if the input is invalid.
        :param move_cursor_to_end: Move the cursor to the end of the input, if
            the input is invalid.
        )_ValidatorFromCallable)clsr2   r3   r4   r   r   r    from_callableP   s    zValidator.from_callableN)r/   F)	r#   r&   r'   r(   r   r-   r.   classmethodr7   r   r   r   r    r   .   s   	  )	metaclassc                   @  sB   e Zd ZdZdddddddZdd	d
dZdddddZdS )r5   z0
    Validate input from a simple callable.
    r0   r   r1   r   )funcr3   r4   r   c                 C  s   || _ || _|| _d S r   )r:   r3   r4   )r   r:   r3   r4   r   r   r    r   n   s    z_ValidatorFromCallable.__init__r!   c                 C  s   d| j dS )NzValidator.from_callable())r:   r$   r   r   r    r%   u   s    z_ValidatorFromCallable.__repr__r	   r*   c                 C  s4   |  |js0| jrt|j}nd}t|| jdd S )Nr   )r   r   )r:   textr4   lenr   r3   )r   r+   indexr   r   r    r-   x   s
    z_ValidatorFromCallable.validateN)r#   r&   r'   r(   r   r%   r-   r   r   r   r    r5   i   s   r5   c                   @  s@   e Zd ZdZdddddZdddd	d
ZdddddZdS )r   z
    Wrapper that runs input validation in a thread.
    (Use this to prevent the user interface from becoming unresponsive if the
    input validation takes too much time.)
    r   r   )	validatorr   c                 C  s
   || _ d S r   )r?   )r   r?   r   r   r    r      s    zThreadedValidator.__init__r	   r*   c                 C  s   | j | d S r   )r?   r-   r,   r   r   r    r-      s    zThreadedValidator.validatec                   s&   dd fdd}t |I dH  dS )z:
        Run the `validate` function in a thread.
        r   r!   c                     s
     S r   )r-   r   r+   r   r   r    run_validation_thread   s    z?ThreadedValidator.validate_async.<locals>.run_validation_threadNr   )r   r+   rA   r   r@   r    r.      s    z ThreadedValidator.validate_asyncNr#   r&   r'   r(   r   r-   r.   r   r   r   r    r      s   c                   @  s    e Zd ZdZdddddZdS )r   z1
    Validator class that accepts any input.
    r	   r   r*   c                 C  s   d S r   r   r,   r   r   r    r-      s    zDummyValidator.validateN)r#   r&   r'   r(   r-   r   r   r   r    r      s   c                   @  s2   e Zd ZdZddddddZddd	d
dZdS )r   zq
    Validator that can be switched on/off according to
    a filter. (This wraps around another validator.)
    r   r
   r   )r?   filterr   c                 C  s   || _ t|| _d S r   )r?   r   rC   )r   r?   rC   r   r   r    r      s    zConditionalValidator.__init__r	   r*   c                 C  s   |   r| j| d S r   )rC   r?   r-   r,   r   r   r    r-      s    zConditionalValidator.validateN)r#   r&   r'   r(   r   r-   r   r   r   r    r      s   c                   @  s@   e Zd ZdZdddddZdddd	d
ZdddddZdS )r   z
    Validator class that can dynamically returns any Validator.

    :param get_validator: Callable that returns a :class:`.Validator` instance.
    zCallable[[], Validator | None]r   )get_validatorr   c                 C  s
   || _ d S r   )rD   )r   rD   r   r   r    r      s    zDynamicValidator.__init__r	   r*   c                 C  s   |   pt }|| d S r   )rD   r   r-   r   r+   r?   r   r   r    r-      s    zDynamicValidator.validatec                   s"   |   pt }||I d H  d S r   )rD   r   r.   rE   r   r   r    r.      s    zDynamicValidator.validate_asyncNrB   r   r   r   r    r      s   N)r(   
__future__r   abcr   r   typingr   Zprompt_toolkit.eventloopr   r+   r	   filtersr
   r   __all__	Exceptionr   r   r5   r   r   r   r   r   r   r   r    <module>   s(   
;	