o
    ܀c-                     @   sZ   d dl Z d dlmZ ddlmZ dd ZdddZd	d
 ZG dd dZG dd dZ	dS )    N)
xform_name   )get_data_memberc                 C   s   | D ]	}|du r dS qdS )z
    Return True if all elements of the iterable are not None (or if the
    iterable is empty). This is like the built-in ``all``, except checks
    against None, so 0 and False are allowable values.
    NFT )iterableelementr   r   C/usr/local/lib/python3.10/dist-packages/boto3/resources/response.pyall_not_none   s
   r	   c           	      C   s   g }| D ]M}|j }|j}|dkrt|j|}n0|dkr$t|j|}n$|dkr1t|t|j}n|dkr<t||j}n|dkrAqt	d| |
t||f q|S )a  
    Builds a mapping of identifier names to values based on the
    identifier source location, type, and target. Identifier
    values may be scalars or lists depending on the source type
    and location.

    :type identifiers: list
    :param identifiers: List of :py:class:`~boto3.resources.model.Parameter`
                        definitions
    :type parent: ServiceResource
    :param parent: The resource instance to which this action is attached.
    :type params: dict
    :param params: Request parameters sent to the service.
    :type raw_response: dict
    :param raw_response: Low-level operation response.
    :rtype: list
    :return: An ordered list of ``(name, value)`` identifier tuples.
    responserequestParameter
identifierdatainputzUnsupported source type: )sourcetargetjmespathsearchpathgetattrr   namer   NotImplementedErrorappend)	identifiersparentparamsraw_responseresultsr   r   r   valuer   r   r   build_identifiers    s"   r   c                 C   s   d}| |}|j}| r5| dD ]#}|d}|jdkr#|j| }q|jdkr,|j}qtd|j||jdkr>i }|S |jdkrGg }|S |jdkrNi }|S )a  
    Creates an appropriate empty response for the type that is expected,
    based on the service model's shape type. For example, a value that
    is normally a list would then return an empty list. A structure would
    return an empty dict, and a number would return None.

    :type search_path: string
    :param search_path: JMESPath expression to search in the response
    :type operation_name: string
    :param operation_name: Name of the underlying service operation.
    :type service_model: :ref:`botocore.model.ServiceModel`
    :param service_model: The Botocore service model
    :rtype: dict, list, or None
    :return: An appropriate empty value
    N.z[0123456789]$	structurelistz&Search path hits shape type {} from {}map)	operation_modeloutput_shapesplitstrip	type_namemembersmemberr   format)search_pathoperation_nameservice_modelr
   r#   shapeitemr   r   r   build_empty_responseN   s0   






r0   c                   @   s    e Zd ZdZdd Zdd ZdS )
RawHandleraG  
    A raw action response handler. This passed through the response
    dictionary, optionally after performing a JMESPath search if one
    has been defined for the action.

    :type search_path: string
    :param search_path: JMESPath expression to search in the response
    :rtype: dict
    :return: Service response
    c                 C   s
   || _ d S N)r+   )selfr+   r   r   r   __init__   s   
zRawHandler.__init__c                 C   s"   | j r| j dkrt| j |}|S ),  
        :type parent: ServiceResource
        :param parent: The resource instance to which this action is attached.
        :type params: dict
        :param params: Request parameters sent to the service.
        :type response: dict
        :param response: Low-level operation response.
        $)r+   r   r   )r3   r   r   r
   r   r   r   __call__   s   
zRawHandler.__call__N)__name__
__module____qualname____doc__r4   r7   r   r   r   r   r1      s    r1   c                   @   s,   e Zd ZdZ	d	ddZdd Zdd ZdS )
ResourceHandleraf  
    Creates a new resource or list of new resources from the low-level
    response based on the given response resource definition.

    :type search_path: string
    :param search_path: JMESPath expression to search in the response

    :type factory: ResourceFactory
    :param factory: The factory that created the resource class to which
                    this action is attached.

    :type resource_model: :py:class:`~boto3.resources.model.ResponseResource`
    :param resource_model: Response resource model.

    :type service_context: :py:class:`~boto3.utils.ServiceContext`
    :param service_context: Context about the AWS service

    :type operation_name: string
    :param operation_name: Name of the underlying service operation, if it
                           exists.

    :rtype: ServiceResource or list
    :return: New resource instance(s).
    Nc                 C   s"   || _ || _|| _|| _|| _d S r2   )r+   factoryresource_modelr,   service_context)r3   r+   r=   r>   r?   r,   r   r   r   r4      s
   
zResourceHandler.__init__c              	   C   s   | j j}| jj|}| jj||| jd}|}d}| jr#t	| j|}t
t| j j|||}	dd |	 D }
|
r[g }tt|
d D ]}d}|rM|| }|| |||	| qC|S t|	 rk| |||	|}|S d}| jdur|t| j| j| jj}|S )r5   )resource_namesingle_resource_json_definitionr?   Nc                 S   s   g | ]	}t |tr|qS r   )
isinstancer!   ).0vr   r   r   
<listcomp>   s    z,ResourceHandler.__call__.<locals>.<listcomp>r   )r>   typer?   resource_json_definitionsgetr=   load_from_definitionr+   r   r   dictr   r   valuesrangelenr   handle_response_itemr	   r,   r0   r-   )r3   r   r   r
   r@   json_definitionresource_clsr   search_responser   pluraliresponse_itemr   r   r   r7      sX   	
zResourceHandler.__call__c           	      C   s\   d|j ji}| D ]\}}t|tr|d}|||< q
|di |}|dur,||j _|S )a  
        Handles the creation of a single response item by setting
        parameters and creating the appropriate resource instance.

        :type resource_cls: ServiceResource subclass
        :param resource_cls: The resource class to instantiate.
        :type parent: ServiceResource
        :param parent: The resource instance to which this action is attached.
        :type identifiers: dict
        :param identifiers: Map of identifier names to value or values.
        :type resource_data: dict or None
        :param resource_data: Data for resource attributes.
        :rtype: ServiceResource
        :return: New resource instance.
        clientr   Nr   )metarU   itemsrB   r!   popr   )	r3   rP   r   r   resource_datakwargsr   r   resourcer   r   r   rN     s   


z$ResourceHandler.handle_response_itemr2   )r8   r9   r:   r;   r4   r7   rN   r   r   r   r   r<      s    
Tr<   )NN)
r   botocorer   r   r   r	   r   r0   r1   r<   r   r   r   r   <module>   s   
.3