
    i.                     X   d Z ddlmZmZmZmZ ddlmZmZm	Z	m
Z
mZmZ ddlm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mZmZmZmZmZmZmZm Z m!Z! d	ed
ee"ef   fdZ# G d de      Z$ddddZ%e G d de$             Z&e G d de$             Z' ede$      Z(e G d de             Z)y)z1Edge payload processor configuration dataclasses.    )	dataclassfieldfieldsreplace)AnyDictMappingTypeTypeVarcast)enum_options_from_values)get_function_catalog)EDGE_PROCESSOR_FUNCTION_DIR)SchemaLookupErrorget_edge_processor_schemaiter_edge_processor_schemas)

BaseConfigChildKeyConfigErrorConfigFieldSpecensure_listoptional_booloptional_strrequire_mappingrequire_strextend_pathconfigreturnc                     i }t        |       D ]5  }|j                  dk(  rt        | |j                        ||j                  <   7 |S )Npath)r   namegetattr)r   payload	field_objs      O/Users/bowang/.openclaw/workspace/ChatDev/entity/configs/edge/edge_processor.py_serialize_configr&      sD     GF^	>>V#")&).."A	 $ N    c                   (    e Zd ZdZdefdZdefdZy)EdgeProcessorTypeConfigz0Base helper class for payload processor configs.r   c                 .    | j                   j                  S N)	__class____name__selfs    r%   display_labelz%EdgeProcessorTypeConfig.display_label(   s    ~~&&&r'   c                     t        |       S r+   )r&   r.   s    r%   to_external_valuez)EdgeProcessorTypeConfig.to_external_value+   s     &&r'   N)r-   
__module____qualname____doc__strr0   r   r2    r'   r%   r)   r)   %   s    :'s ''3 'r'   r)   z3Leave the payload untouched when no match is found.z9Apply default_value (or empty string) if nothing matches.z;Discard the payload entirely when the regex does not match.passdefaultdropc                      e Zd ZU dZdZeed<   dZeez  dz  ed<   dZ	e
ed<   dZe
ed	<   dZe
ed
<   dZe
ed<   dZedz  ed<   dZeed<   dZedz  ed<    eddddd       eddddd       edddddd       ed	dddddd       ed
dddddd       edddddd d       edd!ddd"d#       edd$d%ddg d&d' e eej+                               ed(      d)	       edd*ddd+d#      d,	Zed-eeef   d.ed/d fd0       Zd/efd1Zy)2RegexEdgeProcessorConfigz1Configuration for regex-based payload extraction. patternNgroupTcase_sensitiveF	multilinedotallmultipletemplater9   on_no_matchdefault_valuezRegex Patternr6   z2Python regular expression used to extract content.r!   display_name	type_hintrequireddescriptionzCapture Groupz:Capture group name or index. Defaults to the entire match.zCase Sensitiveboolz+Whether the regex should be case sensitive.)r!   rI   rJ   rK   r:   rL   zMultiline Flagz%Enable multiline mode (re.MULTILINE).)r!   rI   rJ   rK   r:   rL   advancezDotall FlagzEnable dotall mode (re.DOTALL).zReturn Multiple Matchesz9Whether to collect all matches instead of only the first.zOutput TemplatezLOptional template applied to the extracted value. Use '{match}' placeholder.)r!   rI   rJ   rK   rL   rN   zNo Match Behaviorenumr8   z Behavior when no match is found.preserve_label_case)	r!   rI   rJ   rK   r:   rO   rL   enum_optionsrN   zDefault Valuez*Fallback content when on_no_match=default.)	r?   r@   rA   rB   rC   rD   rE   rF   rG   datar    r   c                   t        ||      }t        |d|d      }|j                  d      }d }|Xt        |t              r|}nEt        |t
              r|j                         rt	        |      }n|}nt        dt        |d            t        |d|d      }t        |d|d	      }t        |d
|d      }	t        |d|d      }
t        |d|      xs d}|dvrt        dt        |d            t        |d|      }t        |d|      } | |||d	n
t        |      |	t        |	      nd|
t        |
      nd|t        |      nd||||
      S )Nr?   Fallow_emptyr@   zgroup must be str or intrD   )r:   rA   TrB   rC   rF   r9   >   r;   r9   r:   z)on_no_match must be pass, default or droprE   rG   )
r?   r@   rA   rB   rC   rD   rE   rF   rG   r    )r   r   get
isinstanceintr6   isdigitr   r   r   r   rM   )clsrS   r    mappingr?   group_valuegroup_normalizedrD   rA   rB   rC   rF   rE   rG   s                 r%   	from_dictz"RegexEdgeProcessorConfig.from_dict   sn   !$-gy$EJkk'*-1"+s+#. K-&&('*;'7$'2$!"<k$PW>XYY *dEJ&w0@$PTU!';eL	w$F"7M4@JF99I;W[]jKkllT:$WotD"#1#94tN?S)2)>d9oE#)#54<5'/';T(^#'
 	
r'   c                 "    d| j                    dS )Nzregex())r?   r.   s    r%   r0   z&RegexEdgeProcessorConfig.display_label   s    ~Q''r'   )r-   r3   r4   r5   r?   r6   __annotations__r@   rY   rA   rM   rB   rC   rD   rE   rF   rG   r   r   list_NO_MATCH_DESCRIPTIONSkeysFIELD_SPECSclassmethodr	   r   r_   r0   r7   r'   r%   r=   r=   8   s   ;GS"E39t"NDItFDHdHcDjK $M3:$ #(L
 !(T
 *!)E
 %)?
 "&9
 $2S
 $*f
 ',,:1+0023&$(
 
 ) (D
URKh %
WS#X. %
 %
A[ %
 %
N(s (r'   r=   c                        e Zd ZU dZdZeed<   d eddddd      iZe	d	e
eef   f fd
       Ze	deeef   ded	d fd       Zd	efdZd	efdZ xZS )FunctionEdgeProcessorConfigz4Configuration for function-based payload processors.r>   r!   zFunction Namer6   Tz@Name of the Python function located in functions/edge_processor.rH   r   c           	         t         
|          }|j                  d      }|s|S t        t              }|j                         }|j                         }|j                  xs d}|j                  r| d|j                   d}n|s| d}i }|D ]*  }|j                  |      }	|	r|	j                  nd xs d||<   , t        ||xs d |rt        ||d      nd |	      |d<   |S )
Nr!   zProcessor function namez (Loading failed: ra   z; (No processor functions found in functions/edge_processor)zNo description provided.TrP   )rO   rR   rL   )superfield_specsrW   r   r   list_function_nameslist_metadatarL   
load_errorr   r   )r[   specs	name_speccatalognamesmetadatarL   descriptionsr!   metar,   s             r%   rl   z'FunctionEdgeProcessorConfig.field_specs   s    #%IIf%	L&'BC++-((*++H/H(M);G<N<N;OqQK(M)deKD<<%D6:$"2"2!cIcL   $di1%[_`os#	
f r'   rS   r    c                L    t        ||      }t        |d|d      } | ||      S )Nr!   FrU   )r!   r    )r   r   )r[   rS   r    r\   r!   s        r%   r_   z%FunctionEdgeProcessorConfig.from_dict   s+    !$-7FDeD4((r'   c                 "    | j                   xs dS )Nfunctionr!   r.   s    r%   r0   z)FunctionEdgeProcessorConfig.display_label   s    yy&J&r'   c                     d| j                   iS )Nr!   rz   r.   s    r%   r2   z-FunctionEdgeProcessorConfig.to_external_value   s    		""r'   )r-   r3   r4   r5   r!   r6   rb   r   rf   rg   r   rl   r	   r   r_   r0   r2   __classcell__r,   s   @r%   ri   ri      s    >D#N 	(Z
K Do!56  8 )WS#X. ) )A^ ) )
's '#3 #r'   ri   TProcessorConfig)boundc                        e Zd ZU dZeed<   eed<    eddddd       edd	d
dd      dZe	de
dedd fd       Ze	deeee   f   fd       Ze	deeef   f fd       ZdefdZde
fdZdee   dedz  fdZ xZS )EdgeProcessorConfigz2Wrapper config storing processor type and payload.typer   zProcessor Typer6   TzMSelect which processor implementation to use (regex_extract, function, etc.).rH   zProcessor Configobjectz.Payload interpreted by the selected processor.r   r   rS   r    r   c                v   |t        d|      t        ||      }t        |d|      }|j                  d      }|t        dt	        |d            	 t        |      }|j                  j                  |t	        |d            } | |||      S # t        $ r }t        d| dt	        |d            |d }~ww xY w)	Nz&processor configuration cannot be nullr   r   zprocessor config is requiredzunknown processor type '')r    )r   r   r    )	r   r   r   rW   r   r   r   
config_clsr_   )	r[   rS   r    r\   processor_typeconfig_payloadschemaexcprocessor_configs	            r%   r_   zEdgeProcessorConfig.from_dict  s    <FMM!$-$Wfd; X.!<k$PX>YZZ	p.~>F ",,66~KX\^fLg6h/?dKK ! 	p 88HJKX\^dLefloo	ps   B 	B8B33B8c                     t               j                         D ci c]  \  }}t        d|      |j                   c}}S c c}}w )Nr   )r   value)r   itemsr   r   )r[   r!   r   s      r%   child_routesz EdgeProcessorConfig.child_routes+  sK     !< = C C E
 Ef 840&2C2CC E
 	
 
s   "Ac           	      0   t         |          }|j                  d      }|rmt               }t	        |j                               }|j                         D ci c]  \  }}||j                   }}}t        ||t        ||d            |d<   |S c c}}w )Nr   TrP   )rO   rR   )
rk   rl   rW   r   rc   re   r   summaryr   r   )	r[   rp   	type_specregistrationsrs   r!   r   ru   r,   s	           r%   rl   zEdgeProcessorConfig.field_specs2  s    #%IIf%	79M++-.EEREXEXEZ[EZ\T6D&..0EZL[#5e\_cdE&M
  \s   Bc                 6    | j                   j                         S r+   )r   r0   r.   s    r%   r0   z!EdgeProcessorConfig.display_labelA  s    {{((**r'   c                 P    | j                   | j                  j                         dS )Nr   )r   r   r2   r.   s    r%   r2   z%EdgeProcessorConfig.to_external_valueD  s#    IIkk335
 	
r'   expected_typeNc                 T    | j                   }t        ||      rt        t        |      S y r+   )r   rX   r   r~   )r/   r   r   s      r%   	as_configzEdgeProcessorConfig.as_configJ  s&    fm,(&11r'   )r-   r3   r4   r5   r6   rb   r)   r   rf   rg   r   r_   r   r   r
   r   r   rl   r0   r2   r~   r   r|   r}   s   @r%   r   r     s    <
I##  )g
 "+H
K" LS L3 L3H L L 
T(D,<"<= 
 
 Do!56  +s +
3 
t,<'= BRUYBY r'   r   N)*r5   dataclassesr   r   r   r   typingr   r   r	   r
   r   r   entity.enum_optionsr   utils.function_catalogr   utils.function_managerr   schema_registryr   r   r   entity.configs.baser   r   r   r   r   r   r   r   r   r   r6   r&   r)   rd   r=   ri   r~   r   r7   r'   r%   <module>r      s    7 9 9 : : 8 7 > 
  j T#s(^ 'j ' BJI  J(6 J( J(Z 6#"9 6# 6#r -5LM  J* J Jr'   