
                         f    d dl Z d dlZd dlmZ ddlmZ  e j                  d      Zd Zd	dZ	d
dZ
y)    N)
xform_name   )ResourceLoadExceptionz	\[(.*)\]$c                    | j                   j                  Kt        | d      r| j                          n.t	        dj                  | j                  j                              t        j                  || j                   j                        S )aE  
    Get a data member from a parent using a JMESPath search query,
    loading the parent if required. If the parent cannot be loaded
    and no data is present then an exception is raised.

    :type parent: ServiceResource
    :param parent: The resource instance to which contains data we
                   are interested in.
    :type path: string
    :param path: The JMESPath expression to query
    :raises ResourceLoadException: When no data is present and the
                                   resource cannot be loaded.
    :returns: The queried data or ``None``.
    loadz{0} has no load method!)
metadatahasattrr   r   format	__class____name__jmespathsearch)parentpaths     )lib/third_party/boto3/resources/params.pyget_data_memberr      sm      {{66"KKM')001A1A1J1JKM M ??4!1!122    c                 `   |i }|j                   D ]  }|j                  }|j                  }|dk(  r t        | t	        |j
                              }nM|dk(  rt        | |j                        }n1|dv r|j                  }n |dk(  rst        dj                  |            t        ||||        |S )aX  
    Handle request parameters that can be filled in from identifiers,
    resource data members or constants.

    By passing ``params``, you can invoke this method multiple times and
    build up a parameter dict over time, which is particularly useful
    for reverse JMESPath expressions that append to lists.

    :type parent: ServiceResource
    :param parent: The resource instance to which this action is attached.
    :type request_model: :py:class:`~boto3.resources.model.Request`
    :param request_model: The action request model.
    :type params: dict
    :param params: If set, then add to this existing dict. It is both
                   edited in-place and returned.
    :type index: int
    :param index: The position of an item within a list
    :rtype: dict
    :return: Pre-filled parameters to be sent to the request operation.
    
identifierr	   )stringintegerbooleaninputzUnsupported source type: {0})paramssourcetargetgetattrr   namer   r   valueNotImplementedErrorr   build_param_structure)r   request_modelr   indexparamr   r   r    s           r   create_request_parametersr&   3   s    * ~%%\!FJuzz$:;Ev $FEJJ7E77KKEw%.55f=? ? 	ffeU;+ &. Mr   c                    | }|j                  d      }t        |      D ]3  \  }}t        j                  |      }|r|j	                  d      rP|j	                  d      dk(  r|dd }n=t        |j	                  d            }|dt        t        |      dz           }nd}|dd }||vst        ||   t              sg ||<   |t        ||         }t        ||         |k  r&||   j                  i        t        ||         |k  r&|t        |      dz
  k(  r
|||   |<   ||   |   }||vri ||<   |t        |      dz
  k(  r|||<   /||   }6 y)a  
    This method provides a basic reverse JMESPath implementation that
    lets you go from a JMESPath-like string to a possibly deeply nested
    object. The ``params`` are mutated in-place, so subsequent calls
    can modify the same element by its index.

        >>> build_param_structure(params, 'test[0]', 1)
        >>> print(params)
        {'test': [1]}

        >>> build_param_structure(params, 'foo.bar[0].baz', 'hello world')
        >>> print(params)
        {'test': [1], 'foo': {'bar': [{'baz': 'hello, world'}]}}

    .   *Nz[])split	enumerateINDEX_REr   groupintlenstr
isinstancelistappend)	r   r   r    r$   pospartsipartresults	            r   r"   r"   e   sq     CLLE U#4&||A<<?c)9D  Q0E 8#c%j4&7"8!89D CRy3jTD&AD	 }CIc$i.E)D	  $ c$i.E)
 CJN"#(D	%  $i&3D	 CJN"!D	$iU $r   )NN)N)rer   botocorer   
exceptionsr   compiler/   r   r&   r"    r   r   <module>rA      s6    
   . 2::l#34/dC r   