B
    "ec                 @   s   d Z ddlmZmZ ddlmZ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.)
    )ABCMetaabstractmethod)CallableOptional)run_in_executor_with_context   )Document)FilterOrBool	to_filterConditionalValidatorValidationError	ValidatorThreadedValidatorDummyValidatorDynamicValidatorc                   s:   e Zd ZdZdeedd fddZe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    N)cursor_positionmessagereturnc                s   t  | || _|| _d S )N)super__init__r   r   )selfr   r   )	__class__ 8lib/python3.7/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__intstrr   r   __classcell__r   r   )r   r   r      s   c               @   sX   e Zd ZdZeeddddZeddddZede	e
gef e
e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`.
    N)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   validate9   s    zValidator.validatec                s*   y|  | 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   r   validate_asyncC   s    zValidator.validate_asyncInvalid inputF)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)clsr(   r)   r*   r   r   r   from_callableN   s    zValidator.from_callable)r'   F)r   r   r   r    r   r   r%   r&   classmethodr   r"   boolr-   r   r   r   r   r   ,   s   	 )	metaclassc               @   sL   e Zd ZdZeegef eeddddZedddZe	dd	d
dZ
dS )r+   z0
    Validate input from a simple callable.
    N)funcr)   r*   r   c             C   s   || _ || _|| _d S )N)r1   r)   r*   )r   r1   r)   r*   r   r   r   r   l   s    z_ValidatorFromCallable.__init__)r   c             C   s   d| j dS )NzValidator.from_callable())r1   )r   r   r   r   r   t   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   )r1   textr*   lenr   r)   )r   r$   indexr   r   r   r%   w   s
    z_ValidatorFromCallable.validate)r   r   r   r    r   r"   r/   r   r   r   r%   r   r   r   r   r+   g   s
   r+   c               @   s@   e Zd ZdZeddddZeddddZe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.)
    N)	validatorr   c             C   s
   || _ d S )N)r6   )r   r6   r   r   r   r      s    zThreadedValidator.__init__)r$   r   c             C   s   | j | d S )N)r6   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.
        N)r   c                  s
     S )N)r%   r   )r$   r   r   r   run_validation_thread   s    z?ThreadedValidator.validate_async.<locals>.run_validation_thread)r   )r   r$   r7   r   )r$   r   r   r&      s    z ThreadedValidator.validate_async)	r   r   r   r    r   r   r   r%   r&   r   r   r   r   r      s   c               @   s    e Zd ZdZeddddZdS )r   z1
    Validator class that accepts any input.
    N)r$   r   c             C   s   d S )Nr   )r   r$   r   r   r   r%      s    zDummyValidator.validate)r   r   r   r    r   r%   r   r   r   r   r      s   c               @   s2   e Zd ZdZeeddddZe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.)
    N)r6   filterr   c             C   s   || _ t|| _d S )N)r6   r
   r8   )r   r6   r8   r   r   r   r      s    zConditionalValidator.__init__)r$   r   c             C   s   |   r| j| d S )N)r8   r6   r%   )r   r$   r   r   r   r%      s    zConditionalValidator.validate)	r   r   r   r    r   r	   r   r   r%   r   r   r   r   r      s   c               @   sL   e Zd ZdZeg ee f ddddZeddddZ	e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.
    N)get_validatorr   c             C   s
   || _ d S )N)r9   )r   r9   r   r   r   r      s    zDynamicValidator.__init__)r$   r   c             C   s   |   pt }|| d S )N)r9   r   r%   )r   r$   r6   r   r   r   r%      s    zDynamicValidator.validatec                s"   |   pt }||I d H  d S )N)r9   r   r&   )r   r$   r6   r   r   r   r&      s    zDynamicValidator.validate_async)r   r   r   r    r   r   r   r   r   r%   r&   r   r   r   r   r      s   N)r    abcr   r   typingr   r   Zprompt_toolkit.eventloopr   r$   r   filtersr	   r
   __all__	Exceptionr   r   r+   r   r   r   r   r   r   r   r   <module>   s$   ;	