o
    'iU                     @   s&   d dl Z ddlmZ G dd dZdS )    N   )ERROR_CLASSES_MAPc                   @   sJ   e Zd ZdZdddZdedeeef defdd	Zdedefd
dZdS )ErrorClassesReaderz9A reader to load error information from error_classes.py.returnNc                 C   s
   t | _d S )N)r   error_info_map)self r   d/home/ubuntu/transcripts/venv/lib/python3.10/site-packages/duckdb/experimental/spark/errors/utils.py__init__   s   
zErrorClassesReader.__init__error_classmessage_parametersc                 C   s\   |  |}td|}t|t|ksJ d| d| tdd}||jdi |S )z[Returns the completed error message by applying message parameters to the message template.z<([a-zA-Z0-9_-]+)>z3Undefined error message parameter for error class: z. Parameters: z<>z{}Nr   )get_message_templaterefindallsetstr	maketrans	translateformat)r   r   r   message_template message_parameters_from_templatetabler   r   r	   get_error_message   s   
z$ErrorClassesReader.get_error_messagec                 C   s   | d}t|}|dv sJ |d }|| jv r| j| }n
d| d}t|d|d }|dk}|s9|}	|	S |d	 }
|d
 }|
|v rJ||
 }n
d|
 d}t|d|d }|d | }	|	S )a  Returns the message template for corresponding error class from error_classes.py.

        For example,
        when given `error_class` is "EXAMPLE_ERROR_CLASS",
        and corresponding error class in error_classes.py looks like the below:

        .. code-block:: python

            "EXAMPLE_ERROR_CLASS" : {
              "message" : [
                "Problem <A> because of <B>."
              ]
            }

        In this case, this function returns:
        "Problem <A> because of <B>."

        For sub error class, when given `error_class` is "EXAMPLE_ERROR_CLASS.SUB_ERROR_CLASS",
        and corresponding error class in error_classes.py looks like the below:

        .. code-block:: python

            "EXAMPLE_ERROR_CLASS" : {
              "message" : [
                "Problem <A> because of <B>."
              ],
              "sub_class" : {
                "SUB_ERROR_CLASS" : {
                  "message" : [
                    "Do <C> to fix the problem."
                  ]
                }
              }
            }

        In this case, this function returns:
        "Problem <A> because <B>. Do <C> to fix the problem."
        .)r      r   zCannot find main error class ''
messager   r   	sub_classzCannot find sub error class ' )splitlenr   
ValueErrorjoin)r   r   error_classeslen_error_classesmain_error_classmain_error_class_info_mapmsgmain_message_templatehas_sub_classr   sub_error_class"main_error_class_subclass_info_mapsub_error_class_info_mapsub_message_templater   r   r	   r   )   s,   
'

z'ErrorClassesReader.get_message_template)r   N)	__name__
__module____qualname____doc__r
   r   dictr   r   r   r   r   r	   r      s
    
r   )r   r$   r   r   r   r   r   r	   <module>   s   