
    AHj                        d dl mZ d dlmZ d dlmZmZmZmZm	Z	m
Z
mZ d dlmZ  G d de      Z G d de      Z G d	 d
e      Z G d de
      Z G d de
      Z ed      Zeegdf   Z G d dee         Zy)    )annotations)deque)CallableDeque	GeneratorGenericIterable
NamedTupleTypeVar)get_timec                      e Zd ZdZy)
ParseErrorz$Base class for parse related errors.N__name__
__module____qualname____doc__     G/root/tools/cai/cai_env/lib/python3.12/site-packages/textual/_parser.pyr   r   	   s    .r   r   c                      e Zd ZdZy)ParseEOFzEnd of Stream.Nr   r   r   r   r   r      s    r   r   c                      e Zd ZdZy)ParseTimeoutzRead has timed out.Nr   r   r   r   r   r      s    r   r   c                       e Zd ZU dZdZded<   y)Read1zReads a single character.Nfloat | Nonetimeoutr   r   r   r   r   __annotations__r   r   r   r   r      s    # G\ &r   r   c                       e Zd ZU dZdZded<   y)Peek1zCReads a single character, but does not advance the parser position.Nr   r   r   r   r   r   r"   r"      s    M G\ &r   r"   TNc                  R    e Zd ZdZeZeZddZe	d	d       Z
d
dZddZ	 	 	 	 ddZy)ParserzBase class for a simple parser.c                    d| _         t               | _        | j                  | j                  j                        | _        t        | j
                        | _        d | _        y )NF)	_eofr   _tokensparseappend_gennext	_awaiting_timeout_timeselfs    r   __init__zParser.__init__-   sC    	!&JJt||223	(,TYY+/r   c                    | j                   S )z6Is the parser at the end of the file (i.e. exhausted)?)r'   r/   s    r   is_eofzParser.is_eof4   s     yyr   c              #     K   | j                   ~t               | j                   k\  rfd| _         | j                  j                  t	                     | _        | j                  r*| j                  j                          | j                  r)yyyyw)z0Call at regular intervals to check for timeouts.N)r.   r   r+   throwr   r-   r(   popleftr/   s    r   tickzParser.tick9   sk     )hjD<N<N.N!%D!YY__\^<DN,,ll**,, ,, /O)s   BB
Bc              #    K   | j                   rt        d      d| j                  }|j                  }|s:d| _         	 | j                  j                  t                      |r |        |ryd}t        |      }|r |        |r||k  r| j                  }t        |t              r0d| _        | j                  j                  ||         | _	        |dz  }n:t        |t              r*d| _        | j                  j                  ||         | _	        | j                  j                  &t!               | j                  j                  z   | _        |r |        |r||k  ryy# t        $ r Y w xY ww)zFeed data to be parsed.

        Args:
            data: Data to parser.

        Raises:
            ParseError: If the data could not be parsed.

        Yields:
            T: A generic data type.
        zend of file reachedNTr      )r'   r   r(   r6   r+   r5   r   StopIterationlenr-   
isinstancer   r.   sendr"   r   r   )r0   datatokensr6   pos	data_sizer-   s          r   feedzParser.feedA   sD     9923=..DI		
+ i I	)O  IoI)U+%)"!%S	!:qIu-%)"!%S	!:~~%%1%-Z$..2H2H%H"i  Io ! sA   :E7#E'  E7.E7
CE7E7%E7'	E40E73E44E7c              #  $   K   dE d{    y7 w)zImplement to parse a stream of text.

        Args:
            token_callback: Callable to report a successful parsed data type.

        Yields:
            ParseAwaitable: One of `self.read1` or `self.peek1`
        r   Nr   )r0   token_callbacks     r   r)   zParser.parses   s      s   N)returnNone)rE   bool)rE   Iterable[T])r>   strrE   rH   )rD   TokenCallbackrE   z#Generator[Read1 | Peek1, str, None])r   r   r   r   r   read1r"   peek1r1   propertyr3   r7   rB   r)   r   r   r   r%   r%   '   sH    )EE0  -0 d+	,r   r%   )
__future__r   collectionsr   typingr   r   r   r   r	   r
   r   textual._timer   	Exceptionr   r   r   r   r"   r#   rJ   r%   r   r   r   <module>rS      s    "  U U U "/ /z : 'J ''J ' CL!d#WWQZ Wr   