o
    i                     @  sz   d dl mZ d dlmZ d dlmZmZ erd dlmZ d dl	m
Z
 d dlZG dd deZddddZG dd dZdS )    )annotations)web)TYPE_CHECKING	TypedDict)NodeReplace)is_linkNc                   @  s&   e Zd ZU ded< ded< ded< dS )
NodeStructz5dict[str, str | int | float | bool | tuple[str, int]]inputsstr
class_typezdict[str, str]_metaN)__name__
__module____qualname____annotations__ r   r   6/mnt/c/Users/fbmor/ComfyUI/app/node_replace_manager.pyr      s   
 r   Fnode_structempty_inputsboolreturnc                 C  s:   |   }|ri |d< n| d   |d< | d   |d< |S )Nr	   r   )copy)r   r   new_node_structr   r   r   copy_node_struct   s   
r   c                   @  sP   e Zd ZdZdd ZdddZdddZdddZdddZdd Z	dd Z
dS )NodeReplaceManagerz'Manages node replacement registrations.c                 C  s
   i | _ d S N_replacementsselfr   r   r   __init__   s   
zNodeReplaceManager.__init__node_replacer   c                 C  s   | j |jg | dS )z$Register a node replacement mapping.N)r   
setdefaultold_node_idappend)r   r!   r   r   r   register!   s   zNodeReplaceManager.registerr#   r
   r   list[NodeReplace] | Nonec                 C  s   | j |S )z$Get replacements for an old node ID.)r   getr   r#   r   r   r   get_replacement%   s   z"NodeReplaceManager.get_replacementr   c                 C  s
   || j v S )z1Check if a replacement exists for an old node ID.r   r(   r   r   r   has_replacement)   s   
z"NodeReplaceManager.has_replacementpromptdict[str, NodeStruct]c                 C  s  i }t  }| D ]C\}}d|vsd|vrq	|d }|tj vr+| |r+|| |d  D ]\}}t|rK|d }	||	g 	|||d f q1q	|D ]}|| }|d }| 
|}
|
d u rcqO|
d }|j}|tj vrrqOt|dd}||d< |jd ur|jD ]#}d|v r|d |d |d < qd	|v r|d |d	  |d |d < q|||< |jd ur||v r|| D ]#}|\}}}|jD ]}|d
 |kr|d }|| d | }||d< qqqOd S )Nr   r	   r      T)r   	set_valuenew_idold_idold_idxnew_idx)setitemsnodesNODE_CLASS_MAPPINGSkeysr*   addr   r"   r$   r)   new_node_idr   input_mappingoutput_mapping)r   r+   connectionsneed_replacementnode_numberr   r   input_idinput_valueconn_numberreplacementsreplacementr9   r   	input_mapconnsconn_node_numberconn_input_idold_output_idx
output_mapnew_output_idxprevious_inputr   r   r   apply_replacements-   s^   






z%NodeReplaceManager.apply_replacementsc                 C  s   dd | j  D S )z#Serialize all replacements to dict.c                 S  s    i | ]\}}|d d |D qS )c                 S  s   g | ]}|  qS r   )as_dict).0vr   r   r   
<listcomp>d   s    z9NodeReplaceManager.as_dict.<locals>.<dictcomp>.<listcomp>r   )rN   kv_listr   r   r   
<dictcomp>c   s    z.NodeReplaceManager.as_dict.<locals>.<dictcomp>)r   r4   r   r   r   r   rM   a   s   zNodeReplaceManager.as_dictc                   s   | d fdd}d S )Nz/node_replacementsc                   s   t   S r   )r   json_responserM   )requestr   r   r   get_node_replacementsi   s   z<NodeReplaceManager.add_routes.<locals>.get_node_replacements)r'   )r   routesrV   r   r   r   
add_routesh   s   zNodeReplaceManager.add_routesN)r!   r   )r#   r
   r   r&   )r#   r
   r   r   )r+   r,   )r   r   r   __doc__r    r%   r)   r*   rL   rM   rX   r   r   r   r   r      s    



4r   )F)r   r   r   r   r   r   )
__future__r   aiohttpr   typingr   r   comfy_api.latest._io_publicr   comfy_execution.graph_utilsr   r5   r   r   r   r   r   r   r   <module>   s    
