o
    i                  
   @   sF  d dl Z d dlmZ d dlmZ d dlmZ d dlmZ d dlmZ d dlmZ dd	l	m
Z
 d
ZdZdZdZedZe eZd(dededee dee fddZdeeedf defddZdee deeef fddZeefdee dededefddZdedefd d!Zd"ededeeef fd#d$Zd%edefd&d'ZdS ))    N)Any)Optional)Text)TypeVar)Union)MAX_UINT_64BITS   )ensure_text?d   z...i  Tobjattr_stringdefaultreturnc              	   C   s@   | d}|D ]}zt| |} W q ty   | Y   S w | S )a  
    Returns the attribute of `obj` at the dotted path given by `attr_string`
    If no such attribute is reachable, returns `default`

    >>> deep_getattr(cass, 'cluster')
    <cassandra.cluster.Cluster object at 0xa20c350

    >>> deep_getattr(cass, 'cluster.metadata.partitioner')
    u'org.apache.cassandra.dht.Murmur3Partitioner'

    >>> deep_getattr(cass, 'i.dont.exist', default='default')
    'default'
    .)splitgetattrAttributeError)r   r   r   attrsattr r   R/home/ubuntu/.local/lib/python3.10/site-packages/ddtrace/internal/utils/formats.pydeep_getattr   s   
r   valuec                 C   s&   | du rdS t | tr| S |  dv S )z[Convert the given String to a boolean object.

    Accepted values are `True` and `1`.
    NF)true1)
isinstanceboollower)r   r   r   r   asbool1   s
   
r    tags_strc                 C   s   i }| s|S d| v rdnd}|  |D ]*}| }|sqd|v r)| dd\}}n|d}}| | }}|r=|||< q|S )a  
    Parses a string containing key-value pairs and returns a dictionary.
    Key-value pairs are delimited by ':', and pairs are separated by whitespace, comma, OR BOTH.

    This implementation aligns with the way tags are parsed by the Agent and other Datadog SDKs

    :param tags_str: A string of the above form to parse tags from.
    :return: A dict containing the tags that were parsed.
    , :    )r   strip)r!   resseptagkeyvalr   r   r   parse_tags_str?   s    

r-   argsvalue_max_lencmd_max_lenc              	   C   s   d}g }| D ]Z}zIt |ttfrt|dd}nt|}t||kr)|d| t }|t| |krE|d||  }|d|tf  W  n|| |t|7 }W q ty`   |t Y  nw d	|S )zConvert a list of arguments into a space concatenated string

    This function is useful to convert a list of cache keys
    into a resource name or tag value with a max size limit.
    r   backslashreplace)errorsNz%s%sr#   )
r   bytesstrr	   lenVALUE_TOO_LONG_MARKappend	ExceptionVALUE_PLACEHOLDERjoin)r.   r/   r0   lengthoutargcmdprefixr   r   r   stringify_cache_argsa   s(   


r@   c                 C   s*   z
t | ttttfW S  ty   Y dS w )NF)r   listtupleset	frozenset	TypeError)r   r   r   r   is_sequence   s
   rF   root_keyc                 C   s\   t |s| |iS t }t|D ]\}}|  d| }t |r'|t|| q|||< q|S )zFlattens attributesr   )rF   dict	enumerateupdateflatten_key_value)rG   r   	flattenediitemr+   r   r   r   rK      s   
rK   trace_idc                 C   s   | t kr	d| S t| S )zATranslate a trace ID to a string format supported by the backend.z{:032x})r   formatr4   )rO   r   r   r   format_trace_id   s   rQ   )N)loggingtypingr   r   r   r   r   ddtrace.internal.constantsr   compatr	   r9   VALUE_MAX_LENr6   CMD_MAX_LENr   	getLogger__name__logr4   r   r   r    rH   r-   rA   intr@   rF   rK   rQ   r   r   r   r   <module>   s*    
$$" 