o
    !dG%                     @   s   d dl Z d dlZd dlZd dlZd dlZd dlZd dlZd dlmZ d dlm	Z	 d dlm
Z
 dd Zdd Zd,d
dZdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zejdd Zdd Zd d! ZG d"d# d#eZd$d% ZG d&d' d'eZG d(d) d)eZG d*d+ d+eZdS )-    N)sixget_binary_stdout)get_popen_kwargs_for_pager_cmdc                    sZ   t  fdddD s dS t  fdddD s)ttjt ddd	 S t S )
Nc                 3       | ]}| v V  qd S N .0charvaluer   0usr/lib/python3.10/site-packages/awscli/utils.py	<genexpr>       z"split_on_commas.<locals>.<genexpr>)"\'][,c                 3   r   r   r   r	   r   r   r   r      r   )r   r   r   r   r   
escapecharr   )anysplitlistcsvreaderr   StringIO_split_with_quotesr   r   r   r   split_on_commas   s
   
r    c           	      C   s<  zt tjt| ddd }W n tjy   td|  w t|}g }|D ]t}t|}|	d}|dkrs| 	ddkrs|d u sH|	||krsd|v rO|}nt
| ||d}t||d d }|d |d	  d
| }|| q'|d u r}|| q'||dkr|||d q't
| ||||}|| q'|S )Nr   r   r   zBad csv value: %sz=[r         r    )r   r   r   r   r   Error
ValueErroriter_find_quote_char_in_partfind
_eat_itemsr   joinappendcountreplace)	r   parts
iter_partsZ	new_partspart
quote_charZ
list_startZ	new_chunkZ
list_itemsr   r   r   r   '   s8    


r   r$   c                 C   sd   |}| |dg}	 zt|}W n ty   t| w || |d ||r,nq
d|S )z
    Eat items from an iterator, optionally replacing characters with
    a blank and stopping when the end_char has been reached.
    r$   Tr   )r.   r   Zadvance_iteratorStopIterationr&   r,   endswithr+   )r   r0   r1   Zend_charZreplace_charcurrentchunksr   r   r   r*   R   s   

r*   c                 C   s$   d}| D ]}|dv r|} |S q|S )z
    Returns a single or double quote character, whichever appears first in the
    given string. None is returned if the given string doesn't have a single or
    double quote character.
    N)r   r   r   )r1   r2   chr   r   r   r(   d   s   r(   c                 C   sJ   |  ddd }d}t|dkr|d }d}t|dkr!|d }||fS )z
    Grabs the service id and the operation name from an event name.
    This is making the assumption that the event name is in the form
    event.service.operation.
    .r#   Nr   )r   len)Z
event_nameZsplit_eventZservice_nameZoperation_namer   r   r   %find_service_and_method_in_event_namer   s   r:   c                 C      t | ddS )z!Check if shape is a document typeis_document_typeFgetattrshaper   r   r   r<         r<   c                 C   sR   | sdS t  }t | | |j }t|sdS |jD ]
} | jdvr& dS qdS )zCheck if the shape is a document type or wraps document types

    This is helpful to determine if a shape purely deals with document types
    whether the shape is a document type or it is lists or maps whose base
    values are document types.
    F)r   mapT)ShapeRecordingVisitorShapeWalkerwalkvisitedpopr<   	type_name)r@   recording_visitorZ	end_shaper   r   r   is_document_type_container   s   


rJ   c                 C   s   | o| j dko| jddS )z,Check if the shape is a streaming blob type.ZblobZ	streamingF)rH   Zserializationgetr?   r   r   r   is_streaming_blob_type   s   rL   c                 C   r;   )z/Check if the shape is a tagged union structure.Zis_tagged_unionFr=   r?   r   r   r   is_tagged_union_type   rA   rM   c                 C   sF   t  }t }|| j| || j| |jD ]	}t|r  dS qdS )z6Check if document types are ever used in the operationTF)rC   rD   rE   Zinput_shapeZoutput_shaperF   r<   )Zoperation_modelrI   walkerZvisited_shaper   r   r   operation_uses_document_types   s   
rO   c                 C   s   t | tjr
|  S | S )z6JSON encoder that formats datetimes as ISO8601 format.)
isinstancedatetime	isoformat)objr   r   r   json_encoder   s   rT   c               
   c   s>    t  t jt j} zd V  W t  t j|  d S t  t j|  w r   )signalSIGINTSIG_IGN)originalr   r   r   ignore_ctrl_c   s
   "rY   c                 C   s   | j d|| d d S )Nztop-level-args-parsed)Zparsed_argssession)emit)rZ   argsr   r   r    emit_top_level_args_parsed_event   s   
r]   c               
   C   s:   z	t tj W S  ty }  zW Y d } ~ dS d } ~ ww )NF)osisattysysstdoutfileno	Exception)er   r   r   is_a_tty   s   re   c                   @   s<   e Zd Zd
ddZejd
ddZejdd Zdd	 ZdS )OutputStreamFactoryNc                 C   s   || _ |d u rtj| _ d S d S r   )_popen
subprocessPopen)selfpopenr   r   r   __init__   s   zOutputStreamFactory.__init__c                 c   sd    |  |}z&z| jdi |}|jV  W n	 ty   Y nw W |  d S W |  d S |  w )Nr   )_get_process_pager_kwargsrg   stdinIOErrorcommunicate)rj   Zpreferred_pagerZpopen_kwargsprocessr   r   r   get_pager_stream   s   
z$OutputStreamFactory.get_pager_streamc                 c   s    t  V  d S r   r   rj   r   r   r   get_stdout_stream   s   z%OutputStreamFactory.get_stdout_streamc                 C   s   t |}tj|d< |S )Nrn   )r   rh   PIPE)rj   Z	pager_cmdkwargsr   r   r   rm      s   
z-OutputStreamFactory._get_process_pager_kwargsr   )	__name__
__module____qualname__rl   
contextlibcontextmanagerrr   rt   rm   r   r   r   r   rf      s    

rf   c                 C   s(   | d | t|  | d d S )N
)writer   Z	text_type)exoutfiler   r   r   write_exception   s   
r   c                   @   sD   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Zdd Z	dS )rD   c                 C   s   |du rdS g }|  |||S )zWalk through and visit shapes for introspection

        :type shape: botocore.model.Shape
        :param shape: Shape to walk

        :type visitor: BaseShapeVisitor
        :param visitor: The visitor to call when walking a shape
        N)_walkrj   r@   visitorstackr   r   r   rE      s   
zShapeWalker.walkc                 C   sB   |j |v rd S ||j  t| d|j | j||| |  d S )Nz_walk_%s)namer,   r>   rH   _default_scalar_walkrG   r   r   r   r   r     s   
zShapeWalker._walkc                 C   s2   |  || |j D ]\}}| ||| qd S r   )_do_shape_visitmembersitemsr   )rj   r@   r   r   _Zmember_shaper   r   r   _walk_structure  s   zShapeWalker._walk_structurec                 C       |  || | |j|| d S r   )r   r   memberr   r   r   r   
_walk_list     zShapeWalker._walk_listc                 C   r   r   )r   r   r   r   r   r   r   	_walk_map  r   zShapeWalker._walk_mapc                 C   s   |  || d S r   )r   r   r   r   r   r        z ShapeWalker._default_scalar_walkc                 C   s   | | d S r   )visit_shape)rj   r@   r   r   r   r   r     s   zShapeWalker._do_shape_visitN)
rw   rx   ry   rE   r   r   r   r   r   r   r   r   r   r   rD      s    	rD   c                   @   s   e Zd ZdZdd ZdS )BaseShapeVisitorz&Visit shape encountered by ShapeWalkerc                 C   s   d S r   r   rj   r@   r   r   r   r   "  s   zBaseShapeVisitor.visit_shapeN)rw   rx   ry   __doc__r   r   r   r   r   r      s    r   c                   @   s    e Zd ZdZdd Zdd ZdS )rC   z$Record shapes visited by ShapeWalkerc                 C   s
   g | _ d S r   )rF   rs   r   r   r   rl   (  s   
zShapeRecordingVisitor.__init__c                 C   s   | j | d S r   )rF   r,   r   r   r   r   r   +  r   z!ShapeRecordingVisitor.visit_shapeN)rw   rx   ry   r   rl   r   r   r   r   r   rC   &  s    rC   )r$   ) r   rU   rQ   rz   r^   r`   rh   Zawscli.compatr   r   r   r    r   r*   r(   r:   r<   rJ   rL   rM   rO   rT   r{   rY   r]   re   objectrf   r   rD   r   rC   r   r   r   r   <module>   s<   
+
-