o
    ˷e                     @   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 g d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dededdf fdd	Zdef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    cursor_positionmessagereturnNc                    s   t  | || _|| _d S N)super__init__r   r   )selfr   r   	__class__ P/var/www/ideatree/venv/lib/python3.10/site-packages/prompt_toolkit/validation.pyr      s   
zValidationError.__init__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    r   c                
   @   sf   e Zd ZdZededdfddZdeddfddZe			
dde	e
gef de
dedd f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`.
    documentr   Nc                 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$   z|  | W dS  ty    w )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_asyncC   s   zValidator.validate_asyncInvalid inputFvalidate_funcerror_messagemove_cursor_to_endc                 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&   boolr2   r   r   r   r   r   ,   s"    	r   )	metaclassc                   @   sT   e Zd ZdZdeegef dededdfddZdefd	d
Zde	ddfddZ
dS )r0   z0
    Validate input from a simple callable.
    funcr.   r/   r   Nc                 C   s   || _ || _|| _d S r   )r6   r.   r/   )r   r6   r.   r/   r   r   r   r   l   s   
z_ValidatorFromCallable.__init__c                 C   s   d| j dS )NzValidator.from_callable())r6   r    r   r   r   r!   t   s   z_ValidatorFromCallable.__repr__r(   c                 C   s4   |  |js| jrt|j}nd}t|| jdd S )Nr   )r   r   )r6   textr/   lenr   r.   )r   r(   indexr   r   r   r*   w   s   z_ValidatorFromCallable.validate)r   r"   r#   r$   r   r&   r4   r   r!   r	   r*   r   r   r   r   r0   g   s    
r0   c                   @   sF   e Zd ZdZdeddfddZdeddfdd	Zdeddf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.)
    	validatorr   Nc                 C   
   || _ d S r   )r;   )r   r;   r   r   r   r         
zThreadedValidator.__init__r(   c                 C   s   | j | d S r   )r;   r*   r)   r   r   r   r*      s   zThreadedValidator.validatec                    s$   d fdd}t |I dH  dS )z:
        Run the `validate` function in a thread.
        r   Nc                      s
     S r   )r*   r   r(   r   r   r   run_validation_thread   r=   z?ThreadedValidator.validate_async.<locals>.run_validation_thread)r   Nr   )r   r(   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
    r   c                   @   s"   e Zd ZdZdeddfddZdS )r   z1
    Validator class that accepts any input.
    r(   r   Nc                 C   s   d S r   r   r)   r   r   r   r*      s   zDummyValidator.validate)r   r"   r#   r$   r	   r*   r   r   r   r   r      s    r   c                   @   s8   e Zd ZdZdededdfddZdeddfd	d
ZdS )r   zq
    Validator that can be switched on/off according to
    a filter. (This wraps around another validator.)
    r;   filterr   Nc                 C   s   || _ t|| _d S r   )r;   r   r@   )r   r;   r@   r   r   r   r      s   zConditionalValidator.__init__r(   c                 C   s   |   r| j| d S d S r   )r@   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    r   c                   @   sR   e Zd ZdZdeg ee f ddfddZdeddfdd	Z	deddf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.
    get_validatorr   Nc                 C   r<   r   )rA   )r   rA   r   r   r   r      r=   zDynamicValidator.__init__r(   c                 C   s   |   pt }|| d S r   )rA   r   r*   r   r(   r;   r   r   r   r*      s   zDynamicValidator.validatec                    s$   |   pt }||I d H  d S r   )rA   r   r+   rB   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
    r   N)r$   abcr   r   typingr   r   prompt_toolkit.eventloopr   r(   r	   filtersr
   r   __all__	Exceptionr   r   r0   r   r   r   r   r   r   r   r   <module>   s    
;	