
    \d                         d Z ddlmZ ddlmZ ddlmZmZmZ ddl	m
Z
  e            Z G d d          Zd	e
d
dfdZded	e
d
efdZd	e
d
efdZdS )z
Code related to "flattening" events; that is, extracting a description of all
relevant fields from the format string and persisting them for later
examination.
    )defaultdict)	Formatter)AnyDictOptional   )LogEventc                   J    e Zd ZdZd	dZdedee         dee         defdZdS )
KeyFlattenerz
    A L{KeyFlattener} computes keys for the things within curly braces in
    PEP-3101-style format strings as parsed by L{string.Formatter.parse}.
    returnNc                 0    t          d           | _        dS )z/
        Initialize a L{KeyFlattener}.
        c                      dS )Nr    r       7lib/python3.11/site-packages/twisted/logger/_flatten.py<lambda>z'KeyFlattener.__init__.<locals>.<lambda>   s     r   N)r   keys)selfs    r   __init__zKeyFlattener.__init__   s     %0		$:$:			r   	fieldName
formatSpec
conversionc                     |d}|d}d                     |||          }| j        |xx         dz  cc<   | j        |         }|dk    r |dt          | j        |                   z   z  }|S )a  
        Compute a string key for a given field/format/conversion.

        @param fieldName: A format field name.
        @param formatSpec: A format spec.
        @param conversion: A format field conversion type.

        @return: A key specific to the given field, format and conversion, as
            well as the occurrence of that combination within this
            L{KeyFlattener}'s lifetime.
        N z%{fieldName}!{conversion}:{formatSpec})r   r   r   r   /)formatr   str)r   r   r   r   resultns         r   flatKeyzKeyFlattener.flatKey    s     JJ8??!! @ 
 

 		&QIf66cC	& 12222Fr   )r   N)__name__
__module____qualname____doc__r   r   r   r    r   r   r   r   r      sn         
; ; ; ;*23-EMc]	     r   r   eventr   Nc                 J   |                      dd          dS d| v r	| d         }ni }t                      }t                              | d                   D ]\  }}}}|
|dk    rd}|                    |||          }|                    ||d          }||v rE|                    d          r|dd         }d	}	nd
}	t                              |d|           }
|
d         }|dk    rt          }nt          }|	r
 |            } ||          }|||<   |||<   |r|| d<   dS dS )z
    Flatten the given event by pre-associating format fields with specific
    objects and callable results in a L{dict} put into the C{"log_flattened"}
    key in the event.

    @param event: A logging event.
    
log_formatNlog_flattenedrsr   z()TFr   r   )	getr   
aFormatterparser    endswith	get_fieldreprr   )r%   fieldskeyFlattenerliteralTextr   r   r   flattenedKeystructuredKeycallitfield
fieldValueconversionFunctionflattenedValues                 r   flattenEventr<   @   s    yyt$$,%'>>L<F<L<Ll= = #+ #+8iZ J#++Iz:NN$,,Y
BGG6!!d## 	!#2#IFFF$$YE::1X
!%!$ 	&#J++J77-| *} (!'o( (r   r8   c                     t                      }t                              d| z   dz             \  \  }}}}|J |                    |||          }d|vrt	          |           |d         |         S )a.  
    Extract a given format field from the given event.

    @param field: A string describing a format field or log key.  This is the
        text that would normally fall between a pair of curly braces in a
        format string: for example, C{"key[2].attribute"}.  If a conversion is
        specified (the thing after the C{"!"} character in a format field) then
        the result will always be str.
    @param event: A log event.

    @return: A value extracted from the field.

    @raise KeyError: if the field is not found in the given event.
    {}Nr(   )r   r-   r.   r    r<   )r8   r%   r3   r4   r   r   r   keys           r   extractFieldrA   {   s      >>L9C9I9Iec: :65k9j*    


y*j
A
ACe##U!#&&r   c                 \   | d         }t                      }g }t                              | d                   D ]_\  }}}}|                    |           |A|                    |||pd          }|                    t          ||                              `d                    |          S )z
    Format an event which has been flattened with L{flattenEvent}.

    @param event: A logging event.

    @return: A formatted string.
    r(   r'   Nr*   r   )r   r-   r.   appendr    r   join)	r%   fieldValuesr3   r*   r4   r   r   r   r@   s	            r   
flatFormatrF      s     (K>>L
A:D:J:Jl; ; , ,6Y
J 	
 &&y*j>OCPPCHHSS)**+++771::r   )r$   collectionsr   stringr   typingr   r   r   _interfacesr	   r-   r   r<   r   rA   rF   r   r   r   <module>rK      s  
  $ # # # # #       & & & & & & & & & & ! ! ! ! ! !Y[[
) ) ) ) ) ) ) )X8( 8(T 8( 8( 8( 8(v' 'H ' ' ' ' '>h 3      r   