U
    n/e^                     @   sn   d dl Z d dlZd dlmZ d dlmZmZ d dlmZm	Z	 G dd deZ
G dd deZG d	d
 d
ZdS )    N)PaginationError)PageIterator	Paginator)merge_dictsset_value_from_jmespathc                   @   s4   e Zd Zdd Zdd Zdd Zdd Zd	d
 ZdS )AioPageIteratorc                 C   s   |   S N	__anext__self r   8/tmp/pip-unpacked-wheel-8mnez3y6/aiobotocore/paginate.py	__aiter__	   s    zAioPageIterator.__aiter__c                 C  s  | j }d }dd | jD }| jd k	r0|  d }d}d}| jd }d}| | | |I d H }| |}	|r| jd k	r| |	||}d}| 	|	 nd}|
|	}
|
d krg }
t|
}d}| jd k	r|| | j }|dkr| |	|||| |V  qqP|V  ||7 }| |	}tdd | D r.q| jd k	rP|| jkrP|| _q|d k	rx||krxd| }t|d	| || |}qPd S )
Nc                 S   s   i | ]
}|d qS r   r   ).0keyr   r   r   
<dictcomp>   s      z-AioPageIterator.__anext__.<locals>.<dictcomp>r   TFc                 s   s   | ]}|d kV  qd S r   r   )r   tr   r   r   	<genexpr>G   s     z,AioPageIterator.__anext__.<locals>.<genexpr>z(The same next token was received twice: )message)Z
_op_kwargsZ_input_tokenZ_starting_tokenZ_parse_starting_tokenresult_keysZ_inject_starting_params_make_requestZ_extract_parsed_responseZ_handle_first_requestZ _record_non_aggregate_key_valuessearchlenZ
_max_itemsZ_truncate_responseZ_get_next_tokenallvaluesresume_tokenr   Z_inject_token_into_kwargs)r   Zcurrent_kwargsZprevious_next_tokenZ
next_tokenZtotal_itemsZfirst_requestZprimary_result_keyZstarting_truncationresponseparsedZcurrent_responseZnum_current_responseZtruncate_amountr   r   r   r   r
      sx    




  



zAioPageIterator.__anext__c                 C  sN   t |}| 2 z83 d H W }||}t|tr@|D ]
}|V  q2q|V  q6 d S r   )jmespathcompiler   
isinstancelist)r   
expressionZcompiledpageresultselementr   r   r   r   ]   s    



zAioPageIterator.searchc                 C   s(   t | t| j}dd t|| jD S )Nc                 S   s   g | ]\}}t ||qS r   )ResultKeyIterator)r   i
result_keyr   r   r   
<listcomp>i   s   z4AioPageIterator.result_key_iters.<locals>.<listcomp>)aioitertoolsteer   r   zip)r   Zteed_resultsr   r   r   result_key_itersg   s    
z AioPageIterator.result_key_itersc                    s   i }| 2 z3 d H W }|}t |tr6t|dkr6|d }| jD ]r}||}|d krTq<||}|d krvt||j| q<t |tr|| q<t |t	t
tfr<t||j||  q<q6 t|| j | jd k	r| j|d< |S )N      Z	NextToken)r!   tupler   r   r   r   r#   r"   extendintfloatstrr   Znon_aggregate_partr   )r   Zcomplete_resultr   r$   Zresult_expressionZresult_valueZexisting_valuer   r   r   build_full_resultn   s:    






z!AioPageIterator.build_full_resultN)__name__
__module____qualname__r   r
   r   r.   r6   r   r   r   r   r      s
   Q
r   c                   @   s   e Zd ZeZdS )AioPaginatorN)r7   r8   r9   r   ZPAGE_ITERATOR_CLSr   r   r   r   r:      s   r:   c                   @   s(   e Zd ZdZdd Zdd Zdd ZdS )	r'   a  Iterates over the results of paginated responses.

    Each iterator is associated with a single result key.
    Iterating over this object will give you each element in
    the result key list.

    :param pages_iterator: An iterator that will give you
        pages of results (a ``PageIterator`` class).
    :param result_key: The JMESPath expression representing
        the result key.

    c                 C   s   || _ || _d S r   )_pages_iteratorr)   )r   Zpages_iteratorr)   r   r   r   __init__   s    zResultKeyIterator.__init__c                 C   s   |   S r   r	   r   r   r   r   r      s    zResultKeyIterator.__aiter__c                 C  sB   | j 2 z43 d H W }| j|}|d kr*g }|D ]
}|V  q.q6 d S r   )r;   r)   r   )r   r$   r%   resultr   r   r   r
      s    zResultKeyIterator.__anext__N)r7   r8   r9   __doc__r<   r   r
   r   r   r   r   r'      s   r'   )r+   r   Zbotocore.exceptionsr   Zbotocore.paginater   r   Zbotocore.utilsr   r   r   r:   r'   r   r   r   r   <module>   s    