
    Ji                        d dl mZ d dlZd dlmZmZ d dlmZmZm	Z	 d dl
mZ d dlmZ  G d de      Z G d	 d
e      ZddZddZ G d de      Zy)    )annotationsN)AnyType)	BaseModelValidationErrormodel_validator)!import_module_from_qualified_name)Eventc                  f    e Zd ZU dZded<   ded<   ded<   ded	<   g fdd
Ze	 d	 	 	 	 	 dd       Zy)EventEnvelopeWithMetadataz
    Client readable representation of an Event. Includes class metadata in order to support
    matching event types semantically in an extendable manner (e.g. "StartEvent", "StopEvent", etc.).
    zdict[str, Any]value
str | Nonequalified_namestrtypelist[str] | Nonetypesc                    |D ci c]  }|j                   | }}t        | j                  | j                  | j                        j                         }t        j                  ||      S c c}w )z
        Attempts to load the event data as a python class based on the envelope metadata.
        Looks up the event from the registry, if provided. Falls back to the qualified_name, attempting to load from the module path.
        )r   r   r   )client_dataregistry)__name__EventEnveloper   r   r   
model_dumpparse)selfr   eregistry_lookupas_event_envelopes        x/var/www/html/BankruptcyAI-uat/bankruptcy-ai/venv/lib/python3.12/site-packages/workflows/protocol/serializable_events.py
load_eventz$EventEnvelopeWithMetadata.load_event   sl    
 3;;Q1::q=;;)**499T=P=P

*, 	 "")O # 
 	
	 <s   A,c           	         |j                  d      }t        ||rt        t        |            ndt	        t        |            t        |      j
                        }|S )z
        Build a backward-compatible envelope for an Event, preserving existing
        fields (e.g., qualified_name, value) while adding metadata useful for
        type-safe clients.

        jsonmodeN)r   r   r   r   )r   r   _get_qualified_namer   _get_event_subtypesr   )clseventinclude_qualified_namer   envelopes        r   
from_eventz$EventEnvelopeWithMetadata.from_event+   sX       f -,% /tE{;%d5k2e%%
     N)r   zlist[Type[Event]]returnr
   )T)r(   r
   r)   boolr-   r   )r   
__module____qualname____doc____annotations__r    classmethodr+    r,   r   r   r      s[    
   I79 
 :>37	" r,   r   c                      e Zd ZU dZded<   dZded<   dZded<    ed	      edd
              Z	edd       Z
e	 	 d	 	 	 	 	 	 	 dd       Zy)r   z
    Client write representation of an Event. Includes class metadata in order to support
    matching event types semantically in an extendable manner (e.g. "StartEvent", "StopEvent", etc.).
    z
Any | Noner   Nr   r   r   beforer#   c                    t        |t              r	 t        j                  |      }t        |t
              rd|vrd|v ri |d|d   i}|S # t        j                  $ r Y :w xY w)Nr   data)
isinstancer   r"   loadsJSONDecodeErrordict)r'   r8   s     r   _format_compatibilityz#EventEnvelope._format_compatibilityM   so     dC zz$' dD!d"v~6$6f6 '' s   A A"!A"c                \     | |j                  d      t        |      j                        S )Nr"   r#   )r   r   )r   r   r   )r'   r(   s     r   r+   zEventEnvelope.from_event[   s-    """/e%%
 	
r,   c           	        |xs i }g }	 t        |t              rt        j                  |      n|}t        |t
              st        d      d|vxs d|vxr d|v}|r1|r/|j                  |vri ||j                  |i}|j                  |d}	 t        j                  |      }|j                  ru|j                  |vr?|j                  d|j                   ddj                  |j                                       n(||j                     j                  |j                        S |j                  r`t!        |j                        }t#        |t$              s |j                  d	|j                   d
       n|j                  |j                        S |r|ndg}t        dj                  |            # t        j                  $ r |}Y w xY w# t&        $ r'}	|j                  dt        |	              Y d}	~	hd}	~	ww xY w)a  
        Parse client data into an Event. Raises an EventValidationError if the client data is invalid.

        Args:
            client_data: The client data to parse. Can be a dictionary, a string, or an explicit Event class.
            registry: The registry of event type names to Event classes.
            explicit_event: An explicit Event class to treat the dict as

        Returns:
            The parsed Event.
        zNFailed to deserialize event. Must be a json object, or stringified json objectr   r   r   )r   r   zInvalid event type: z. Expected one of z, z$Invalid client data. Qualified name z) does not correspond to an Event subclasszFailed to deserialize event: NzFInvalid client data. Must have a type or a qualified name, got {event} )r9   r   r"   r:   r;   r<   EventValidationErrorr   r   model_validater   appendjoinkeysr   r   r	   
issubclassr
   r   )
r'   r   r   explicit_eventerrorsas_dictmissing_qualifiersr(   module_classr   s
             r   r   zEventEnvelope.parseb   s   $ >r	"+5k3+G

;'[ 
 '4(&`  G+DvW/D%W$ 	 .&&h6PhP(?(?P&// G	D!009Ezz::X-MM.uzzl:LTYYW_WdWdWfMgLhi $EJJ/>>u{{KK##@AUAUV!,6MM>u?S?S>TT}~ (66u{{CC
   Y 	 #388F#344W ## 	"!G	"D  	DMM9#a&BCC	Ds1   'F3 BG &A+G 3GG	G?G::G?)r8   r   r-   r   )r(   r
   r-   r   )NN)r   zdict[str, Any] | strr   zdict[str, Type[Event]] | NonerG   zType[Event] | Noner-   r
   )r   r/   r0   r1   r2   r   r   r   r3   r=   r+   r   r4   r,   r   r   r   C   s    
 D*!%NJ%(#
  $
 
 
  37-1	B5)B5 0B5 +	B5
 
B5 B5r,   r   c                    g }| j                         dd D ]8  }|t        u r n.t        |t              s|j                  |j                         : |sy|S )zo
    Traverses the MRO (Module Resolution Order) of a class and returns the list of only Event subclasses.
       N)mror
   rF   rC   r   )r'   namescs      r   r&   r&      sU     EWWYqr] %:aLL$	%
 Lr,   c                8    | j                    d| j                   S )N.)r/   r   )r(   s    r   r%   r%      s    q 011r,   c                      e Zd ZdZy)rA   z'Raised when the client data is invalid.N)r   r/   r0   r1   r4   r,   r   rA   rA      s    1r,   rA   )r'   Type[Event]r-   r   )r(   rT   r-   r   )
__future__r   r"   typingr   r   pydanticr   r   r   workflows.context.utilsr	   workflows.eventsr
   r   r   r&   r%   	ExceptionrA   r4   r,   r   <module>r[      sN    #   @ @ E "1	 1hb5I b5J 229 2r,   