o
    ?DiV                     @   s2   d dl Z d dlmZ ddlmZ G dd dZdS )    N)Dict   )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 )ErrorClassesReaderzC
    A reader to load error information from error_classes.py.
    returnNc                 C   s
   t | _d S )N)r   error_info_map)self r	   _/var/www/Datamplify/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 )zm
        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td| dd|d }|dk}|s7|}|S |d	 }	|d
 }
|	|
v rH|
|	 }ntd|	 d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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   r   r   r   r	   r	   r	   r
   r      s
    
r   )r   typingr   r%   r   r   r	   r	   r	   r
   <module>   s   