
    XIgV                     8    d dl Z d dlmZ ddlmZ  G d d      Zy)    N)Dict   )ERROR_CLASSES_MAPc                   F    e Zd ZdZd	dZdedeeef   defdZdedefdZy)
ErrorClassesReaderzC
    A reader to load error information from error_classes.py.
    returnNc                     t         | _        y )N)r   error_info_map)selfs    c/var/www/html/answerous/venv/lib/python3.12/site-packages/duckdb/experimental/spark/errors/utils.py__init__zErrorClassesReader.__init__   s
    /    error_classmessage_parametersc                    | j                  |      }t        j                  d|      }t        |      t        |      k(  sJ d| d|        t        j                  dd      } |j                  |      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{} )get_message_templaterefindallsetstr	maketrans	translateformat)r   r   r   message_template message_parameters_from_templatetables         r   get_error_messagez$ErrorClassesReader.get_error_message    s      44[A+-::6JL\+](34<N8OO 	
A+ O-.0	
O dD)7))%077M:LMMr   c                 j   |j                  d      }t        |      }|dv sJ |d   }|| j                  v r| j                  |   }nt        d| d      dj	                  |d         }|dk(  }|s|}|S |d	   }	|d
   }
|	|
v r|
|	   }nt        d|	 d      dj	                  |d         }|dz   |z   }|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_templates                r   r   z'ErrorClassesReader.get_message_template/   s   P $))#.. F*** )+t222(,(;(;<L(M%=>N=OqQRR $		*CI*N O)Q.4   ,A.O1J;1W."DD+Mo+^( #@@QQR!STT#'99-Ei-P#Q 4s:=QQr   )r   N)	__name__
__module____qualname____doc__r   r   r   r   r   r   r   r   r   r      sJ    0NS Nd3PS8n NY\ NE  E  E r   r   )r   typingr   r+   r   r   r   r   r   <module>r:      s   $ 
  ,\  \ r   