o
    i.                     @   sD  U d Z ddlZddlmZ ddlmZmZmZmZ ddl	m
Z
 ddlmZ ddlmZmZmZ er7ddlmZ d	Zd
ededefddZdeB eB eB ZdeB eeef B Zeeef dB ZeeB eB Zeed< eee B Zeed< eee B Z eed< ee eB e B Z!deB eB eB e"B Z#e
eeege#f dB Z$G dd dZ%dS )z=Methods for converting Datasets and DataElements to/from json    N)	signature)	TypeAliasAnycastTYPE_CHECKING)Callable)warn_and_log)FLOAT_VRINT_VRVR)Dataset)ValueBulkDataURIInlineBinaryvaluevrreturnc                    s~   ddl m  | du sn| S dttjh tjhB v rttv r#tdu r)| S t	| t
tB r; fdd| D S | S )aO  When possible convert numeric-like values to either ints or floats
    based on their value representation.

    Parameters
    ----------
    value : Any
        Value of the data element.
    vr : str
        Value representation of the data element.

    Returns
    -------
    Any

        * If `value` is empty then returns the `value` unchanged.
        * If `vr` is an integer-like VR type then returns ``int`` or
          ``List[int]``
        * If `vr` is a float-like VR type then returns ``float`` or
          ``List[float]``
        * Otherwise returns `value` unchanged

    r   empty_value_for_VRN c                    s$   g | ]}|d ur|n qS N .0vr   number_typer   r   E/mnt/sdb/aimis/docanh/lib/python3.10/site-packages/pydicom/jsonrep.py
<listcomp>9   s    z,convert_to_python_number.<locals>.<listcomp>)pydicom.dataelemr   r
   r   ATUS_SSintr	   float
isinstancelisttuple)r   r   r   r   r   convert_to_python_number   s   
r'   	ValueTypeInlineBinaryTypeBulkDataURITypec                   @   s   e Zd ZdZ	dded dededededB d	eeege	f B dB d
dfddZ
d
efddZded
efddZded
dfddZdeeeef B d
efddZdS )JsonDataElementConvertera  Convert from a JSON struct to a :class:`DataElement`.

    References
    ----------

    * :dcm:`Annex F of Part 18 of the DICOM Standard<part18/chapter_F.html>`
    * `JSON to Python object conversion table
      <https://docs.python.org/3/library/json.html#json-to-py-table>`_
    Ndataset_classr   tagr   r   	value_keybulk_data_uri_handlerr   c                    st   || _ || _|| _|| _|| _|  |  r2tt jdkr2dtdtdtdt	f fdd}|| _
dS tt | _
dS )	a  Create a new converter instance.

        Parameters
        ----------
        dataset_class : dataset.Dataset derived class
            The class object to use for **SQ** element items.
        tag : str
            The data element's tag in uppercase hex format like ``"7FE00010"``.
        vr : str
            The data element value representation.
        value : str or List[None | str | int | float | dict]
            The attribute value for the JSON object's "Value", "InlineBinary"
            or "BulkDataURI" field. If there's no such attribute then `value`
            will be ``[""]``.
        value_key : str or None
            The attribute name for `value`, should be one of:
            ``{"Value", "InlineBinary", "BulkDataURI"}``. If the element's VM
            is ``0`` and none of the keys are used then will be ``None``.
        bulk_data_uri_handler: callable, optional
            Callable function that accepts either the `tag`, `vr` and the
            "BulkDataURI" `value`, or just the "BulkDataURI" `value` of the
            JSON representation of a data element and returns the actual
            value of that data element (retrieved via DICOMweb WADO-RS). If
            no `bulk_data_uri_handler` is specified (default) then the
            corresponding element will have an "empty" value such as
            ``""``, ``b""`` or ``None`` depending on the
            `vr` (i.e. the Value Multiplicity will be 0).
           r-   r   r   r   c                    s   t ttgtf  }||S r   )r   r   strBulkDataType)r-   r   r   xhandlerr   r   wrapper   s   z2JsonDataElementConverter.__init__.<locals>.wrapperN)r,   r-   r   r   r.   lenr   
parametersr1   r2   bulk_data_element_handlerr   BulkDataHandlerType)selfr,   r-   r   r   r.   r/   r6   r   r4   r   __init__Y   s   '
z!JsonDataElementConverter.__init__c                    s  ddl m}  jdu r| jS  jdkrWt jts(td j d j d js0| jS t	tt
  j} fdd	|D }t|d
krQ jtjkrQ|d }t| jS t	ttt B  j}t|trj|d } jdkrt|tstd j dt|j t|S  jdkrt|tstd j dt|j  jdu rtd j d | jS   j j|S td j d j )zReturn a the data element value or list of values.

        Returns
        -------
        None, str, float, int, bytes, dataset_class or a list of these
            The value or value list of the newly created data element.
        r   r   Nr   'z' of data element 'z' must be a listc                    s   g | ]}  |qS r   )get_regular_element_valuer   r;   r   r   r      s    z?JsonDataElementConverter.get_element_values.<locals>.<listcomp>r0   r   z*Invalid attribute value for data element 'z2' - the value for 'InlineBinary' must be str, not r   z1' - the value for 'BulkDataURI' must be str, not zJNo bulk data URI handler provided for retrieval of value of data element ""zUnknown attribute name 'z
' for tag )r   r   r.   r   r$   r   r%   	TypeErrorr-   r   r(   r7   r   SQr'   r1   type__name__base64	b64decoder9   r   
ValueError)r;   r   valelement_valuer   r   r?   r   get_element_values   sX   













z+JsonDataElementConverter.get_element_valuesc                 C   s   ddl m} | jtjkrttttf |}| 	|S |du r#|| jS | jtj
kr7ttttf |}| |S | jtjkr[tt|}zt|dW S  tyZ   td| d Y dS w |S )aj  Return a the data element value created from a json "Value" entry.

        Parameters
        ----------
        value : None, str, int, float or dict
            The data element's value from the json entry.

        Returns
        -------
        None, str, int, float or Dataset
            A single value of the corresponding :class:`DataElement`.
        r   r   N   zInvalid value 'z' for AT element - ignoring it)r   r   r   r   rB   r   dictr1   r   get_sequence_itemPNget_pn_element_valuer    r"   rG   r   )r;   r   r   r   r   r   r>      s$   



z2JsonDataElementConverter.get_regular_element_valuec              	   C   s   ddl m} ddlm} |  }|du ri n|}| D ]G\}}d|vr-td| j d|d }tt	|
 t	t@ }|sL|t|d|||d	}	n|d }
|| j||||
 |
| j}	||	 q|S )
a}  Return a sequence item for the JSON dict `value`.

        Parameters
        ----------
        value : dict or None
            The sequence item from the JSON entry.

        Returns
        -------
        dataset_class
            The decoded dataset item.

        Raises
        ------
        KeyError
            If the "vr" key is missing for a contained element
        r   )DataElementr   Nr   zData element 'z' must have key 'vr'rK   )r-   r   r   )pydicomrP   r   r   r,   itemsKeyErrorr-   r&   setkeysJSON_VALUE_KEYSr"   	from_jsonr9   add)r;   r   rP   r   dskeyrH   r   unique_value_keyselemr.   r   r   r   rM     s0   z*JsonDataElementConverter.get_sequence_itemc                 C   s   t |tstd| j d |S d|v rg d}nd|v r"ddg}ndg}d|v r/|d |d< d|v r9|d |d	< d|v rC|d |d
< d|S )a  Return a person name from JSON **PN** value as str.

        Values with VR PN have a special JSON encoding, see the DICOM Standard,
        Part 18, :dcm:`Annex F.2.2<part18/sect_F.2.2.html>`.

        Parameters
        ----------
        value : Dict[str, str]
            The person name components in the JSON entry.

        Returns
        -------
        str
            The decoded PersonName object or an empty string.
        zValue of data element 'z5' with VR Person Name (PN) is not formatted correctlyPhonetic)r   r   r   Ideographicr   
Alphabeticr   r0      =)r$   rL   r   r-   join)r;   r   compsr   r   r   rO   5  s"   



z-JsonDataElementConverter.get_pn_element_valuer   )rD   
__module____qualname____doc__rC   r1   JSONValueTyper:   r   r2   r<   r   rJ   r(   r>   SQValueTyperM   rL   rO   r   r   r   r   r+   N   s,    

9I("2r+   )&rf   rE   inspectr   typingr   r   r   r   collections.abcr   pydicom.miscr   pydicom.valuerepr	   r
   r   pydicom.datasetr   rV   r1   r'   r"   r#   OtherValueTyperL   PNValueTyperh   r(   __annotations__r%   r)   r*   rg   bytesr2   r:   r+   r   r   r   r   <module>   s*   -